<!doctype html>
<html>
<head>
<meta charset='UTF-8'><meta name='viewport' content='width=device-width initial-scale=1'>
<link href="/css/bootstrap.min.css" rel="stylesheet">
<!-- style sheet of Vssue -->
<link rel="stylesheet" href="https://unpkg.com/vssue/dist/vssue.min.css">
<script src="https://code.jquery.com/jquery-3.6.0.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>

<script src="https://unpkg.com/vue/dist/vue.min.js"></script>
<script src="https://unpkg.com/vssue/dist/vssue.gitee.min.js"></script>
<link href='https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext' rel='stylesheet' type='text/css' /><style type='text/css'>html {overflow-x: initial !important;}:root { --bg-color:#ffffff; --text-color:#333333; --select-text-bg-color:#B5D6FC; --select-text-font-color:auto; --monospace:"Lucida Console",Consolas,"Courier",monospace; --title-bar-height:20px; }
.mac-os-11 { --title-bar-height:28px; }
html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; }
body { margin: 0px; padding: 0px; height: auto; inset: 0px; font-size: 1rem; line-height: 1.42857; overflow-x: hidden; background: inherit; tab-size: 4; }
iframe { margin: auto; }
a.url { word-break: break-all; }
a:active, a:hover { outline: 0px; }
.in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); }
#write { margin: 0px auto; height: auto; width: inherit; word-break: normal; overflow-wrap: break-word; position: relative; white-space: normal; overflow-x: visible; padding-top: 36px; }
#write.first-line-indent p { text-indent: 2em; }
#write.first-line-indent li p, #write.first-line-indent p * { text-indent: 0px; }
#write.first-line-indent li { margin-left: 2em; }
.for-image #write { padding-left: 8px; padding-right: 8px; }
body.typora-export { padding-left: 30px; padding-right: 30px; }
.typora-export .footnote-line, .typora-export li, .typora-export p { white-space: pre-wrap; }
.typora-export .task-list-item input { pointer-events: none; }
@media screen and (max-width: 500px) {
  body.typora-export { padding-left: 0px; padding-right: 0px; }
  #write { padding-left: 20px; padding-right: 20px; }
  .CodeMirror-sizer { margin-left: 0px !important; }
  .CodeMirror-gutters { display: none !important; }
}
#write li > figure:last-child { margin-bottom: 0.5rem; }
#write ol, #write ul { position: relative; }
img { max-width: 100%; vertical-align: middle; image-orientation: from-image; }
button, input, select, textarea { color: inherit; font: inherit; }
input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; }
*, ::after, ::before { box-sizing: border-box; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; }
p { line-height: inherit; }
h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 4; }
p { orphans: 4; }
h1 { font-size: 2rem; }
h2 { font-size: 1.8rem; }
h3 { font-size: 1.6rem; }
h4 { font-size: 1.4rem; }
h5 { font-size: 1.2rem; }
h6 { font-size: 1rem; }
.md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; }
.hidden { display: none; }
.md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; }
a { cursor: pointer; }
sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-radius: 4px; cursor: pointer; }
sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; }
#write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; }
figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; }
figure > table { margin: 0px; }
tr { break-inside: avoid; break-after: auto; }
thead { display: table-header-group; }
table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }
table.md-table td { min-width: 32px; }
.CodeMirror-gutters { border-right: 0px; background-color: inherit; }
.CodeMirror-linenumber { user-select: none; }
.CodeMirror { text-align: left; }
.CodeMirror-placeholder { opacity: 0.3; }
.CodeMirror pre { padding: 0px 4px; }
.CodeMirror-lines { padding: 0px; }
div.hr:focus { cursor: none; }
#write pre { white-space: pre-wrap; }
#write.fences-no-line-wrapping pre { white-space: pre; }
#write pre.ty-contain-cm { white-space: normal; }
.CodeMirror-gutters { margin-right: 4px; }
.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background: inherit; position: relative !important; }
.md-fences-adv-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }
#write .md-fences.mock-cm { white-space: pre-wrap; }
.md-fences.md-fences-with-lineno { padding-left: 0px; }
#write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; }
.md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; }
.CodeMirror-line, twitterwidget { break-inside: avoid; }
.footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; }
.footnotes + .footnotes { margin-top: 0px; }
.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; background: 0px 0px; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; -webkit-tap-highlight-color: transparent; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; }
li div { padding-top: 0px; }
blockquote { margin: 1rem 0px; }
li .mathjax-block, li p { margin: 0.5rem 0px; }
li blockquote { margin: 1rem 0px; }
li { margin: 0px; position: relative; }
blockquote > :last-child { margin-bottom: 0px; }
blockquote > :first-child, li > :first-child { margin-top: 0px; }
.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; }
#write .footnote-line { white-space: pre-wrap; }
@media print {
  body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; font-variant-ligatures: no-common-ligatures; }
  #write { margin-top: 0px; padding-top: 0px; border-color: transparent !important; }
  .typora-export * { -webkit-print-color-adjust: exact; }
  .typora-export #write { break-after: avoid; }
  .typora-export #write::after { height: 0px; }
  .is-mac table { break-inside: avoid; }
  .typora-export-show-outline .typora-export-sidebar { display: none; }
}
.footnote-line { margin-top: 0.714em; font-size: 0.7em; }
a img, img a { cursor: pointer; }
pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background: rgb(204, 204, 204); display: block; overflow-x: hidden; }
p > .md-image:only-child:not(.md-img-error) img, p > img:only-child { display: block; margin: auto; }
#write.first-line-indent p > .md-image:only-child:not(.md-img-error) img { left: -2em; position: relative; }
p > .md-image:only-child { display: inline-block; width: 100%; }
#write .MathJax_Display { margin: 0.8em 0px 0px; }
.md-math-block { width: 100%; }
.md-math-block:not(:empty)::after { display: none; }
.MathJax_ref { fill: currentcolor; }
[contenteditable="true"]:active, [contenteditable="true"]:focus, [contenteditable="false"]:active, [contenteditable="false"]:focus { outline: 0px; box-shadow: none; }
.md-task-list-item { position: relative; list-style-type: none; }
.task-list-item.md-task-list-item { padding-left: 0px; }
.md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); border: none; }
.math { font-size: 1rem; }
.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-radius: 10px; }
.md-toc-content { position: relative; margin-left: 0px; }
.md-toc-content::after, .md-toc::after { display: none; }
.md-toc-item { display: block; color: rgb(65, 131, 196); }
.md-toc-item a { text-decoration: none; }
.md-toc-inner:hover { text-decoration: underline; }
.md-toc-inner { display: inline-block; cursor: pointer; }
.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; }
.md-toc-h2 .md-toc-inner { margin-left: 2em; }
.md-toc-h3 .md-toc-inner { margin-left: 4em; }
.md-toc-h4 .md-toc-inner { margin-left: 6em; }
.md-toc-h5 .md-toc-inner { margin-left: 8em; }
.md-toc-h6 .md-toc-inner { margin-left: 10em; }
@media screen and (max-width: 48em) {
  .md-toc-h3 .md-toc-inner { margin-left: 3.5em; }
  .md-toc-h4 .md-toc-inner { margin-left: 5em; }
  .md-toc-h5 .md-toc-inner { margin-left: 6.5em; }
  .md-toc-h6 .md-toc-inner { margin-left: 8em; }
}
a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }
.footnote-line a:not(.reversefootnote) { color: inherit; }
.md-attr { display: none; }
.md-fn-count::after { content: "."; }
code, pre, samp, tt { font-family: var(--monospace); }
kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; }
.md-comment { color: rgb(162, 127, 3); opacity: 0.6; font-family: var(--monospace); }
code { text-align: left; vertical-align: initial; }
a.md-print-anchor { white-space: pre !important; border-width: initial !important; border-style: none !important; border-color: initial !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; background: 0px 0px !important; text-decoration: initial !important; text-shadow: initial !important; }
.os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; }
.md-diagram-panel > svg { max-width: 100%; }
[lang="flow"] svg, [lang="mermaid"] svg { max-width: 100%; height: auto; }
[lang="mermaid"] .node text { font-size: 1rem; }
table tr th { border-bottom: 0px; }
video { max-width: 100%; display: block; margin: 0px auto; }
iframe { max-width: 100%; width: 100%; border: none; }
.highlight td, .highlight tr { border: 0px; }
mark { background: rgb(255, 255, 0); color: rgb(0, 0, 0); }
.md-html-inline .md-plain, .md-html-inline strong, mark .md-inline-math, mark strong { color: inherit; }
.md-expand mark .md-meta { opacity: 0.3 !important; }
mark .md-meta { color: rgb(0, 0, 0); }
@media print {
  .typora-export h1, .typora-export h2, .typora-export h3, .typora-export h4, .typora-export h5, .typora-export h6 { break-inside: avoid; }
}
.md-diagram-panel .messageText { stroke: none !important; }
.md-diagram-panel .start-state { fill: var(--node-fill); }
.md-diagram-panel .edgeLabel rect { opacity: 1 !important; }
.md-fences.md-fences-math { font-size: 1em; }
.md-fences-advanced:not(.md-focus) { padding: 0px; white-space: nowrap; border: 0px; }
.md-fences-advanced:not(.md-focus) { background: inherit; }
.typora-export-show-outline .typora-export-content { max-width: 1440px; margin: auto; display: flex; flex-direction: row; }
.typora-export-sidebar { width: 300px; font-size: 0.8rem; margin-top: 80px; margin-right: 18px; }
.typora-export-show-outline #write { --webkit-flex:2; flex: 2 1 0%; }
.typora-export-sidebar .outline-content { position: fixed; top: 0px; max-height: 100%; overflow: hidden auto; padding-bottom: 30px; padding-top: 60px; width: 300px; }
@media screen and (max-width: 1024px) {
  .typora-export-sidebar, .typora-export-sidebar .outline-content { width: 240px; }
}
@media screen and (max-width: 800px) {
  .typora-export-sidebar { display: none; }
}
.outline-content li, .outline-content ul { margin-left: 0px; margin-right: 0px; padding-left: 0px; padding-right: 0px; list-style: none; }
.outline-content ul { margin-top: 0px; margin-bottom: 0px; }
.outline-content strong { font-weight: 400; }
.outline-expander { width: 1rem; height: 1.42857rem; position: relative; display: table-cell; vertical-align: middle; cursor: pointer; padding-left: 4px; }
.outline-expander::before { content: ""; position: relative; font-family: Ionicons; display: inline-block; font-size: 8px; vertical-align: middle; }
.outline-item { padding-top: 3px; padding-bottom: 3px; cursor: pointer; }
.outline-expander:hover::before { content: ""; }
.outline-h1 > .outline-item { padding-left: 0px; }
.outline-h2 > .outline-item { padding-left: 1em; }
.outline-h3 > .outline-item { padding-left: 2em; }
.outline-h4 > .outline-item { padding-left: 3em; }
.outline-h5 > .outline-item { padding-left: 4em; }
.outline-h6 > .outline-item { padding-left: 5em; }
.outline-label { cursor: pointer; display: table-cell; vertical-align: middle; text-decoration: none; color: inherit; }
.outline-label:hover { text-decoration: underline; }
.outline-item:hover { border-color: rgb(245, 245, 245); background-color: var(--item-hover-bg-color); }
.outline-item:hover { margin-left: -28px; margin-right: -28px; border-left: 28px solid transparent; border-right: 28px solid transparent; }
.outline-item-single .outline-expander::before, .outline-item-single .outline-expander:hover::before { display: none; }
.outline-item-open > .outline-item > .outline-expander::before { content: ""; }
.outline-children { display: none; }
.info-panel-tab-wrapper { display: none; }
.outline-item-open > .outline-children { display: block; }
.typora-export .outline-item { padding-top: 1px; padding-bottom: 1px; }
.typora-export .outline-item:hover { margin-right: -8px; border-right: 8px solid transparent; }
.typora-export .outline-expander::before { content: "+"; font-family: inherit; top: -1px; }
.typora-export .outline-expander:hover::before, .typora-export .outline-item-open > .outline-item > .outline-expander::before { content: "−"; }
.typora-export-collapse-outline .outline-children { display: none; }
.typora-export-collapse-outline .outline-item-open > .outline-children, .typora-export-no-collapse-outline .outline-children { display: block; }
.typora-export-no-collapse-outline .outline-expander::before { content: "" !important; }
.typora-export-show-outline .outline-item-active > .outline-item .outline-label { font-weight: 700; }
.md-inline-math-container mjx-container { zoom: 0.95; }


.CodeMirror { height: auto; }
.CodeMirror.cm-s-inner { background: inherit; }
.CodeMirror-scroll { overflow: auto hidden; z-index: 3; }
.CodeMirror-gutter-filler, .CodeMirror-scrollbar-filler { background-color: rgb(255, 255, 255); }
.CodeMirror-gutters { border-right: 1px solid rgb(221, 221, 221); background: inherit; white-space: nowrap; }
.CodeMirror-linenumber { padding: 0px 3px 0px 5px; text-align: right; color: rgb(153, 153, 153); }
.cm-s-inner .cm-keyword { color: rgb(119, 0, 136); }
.cm-s-inner .cm-atom, .cm-s-inner.cm-atom { color: rgb(34, 17, 153); }
.cm-s-inner .cm-number { color: rgb(17, 102, 68); }
.cm-s-inner .cm-def { color: rgb(0, 0, 255); }
.cm-s-inner .cm-variable { color: rgb(0, 0, 0); }
.cm-s-inner .cm-variable-2 { color: rgb(0, 85, 170); }
.cm-s-inner .cm-variable-3 { color: rgb(0, 136, 85); }
.cm-s-inner .cm-string { color: rgb(170, 17, 17); }
.cm-s-inner .cm-property { color: rgb(0, 0, 0); }
.cm-s-inner .cm-operator { color: rgb(152, 26, 26); }
.cm-s-inner .cm-comment, .cm-s-inner.cm-comment { color: rgb(170, 85, 0); }
.cm-s-inner .cm-string-2 { color: rgb(255, 85, 0); }
.cm-s-inner .cm-meta { color: rgb(85, 85, 85); }
.cm-s-inner .cm-qualifier { color: rgb(85, 85, 85); }
.cm-s-inner .cm-builtin { color: rgb(51, 0, 170); }
.cm-s-inner .cm-bracket { color: rgb(153, 153, 119); }
.cm-s-inner .cm-tag { color: rgb(17, 119, 0); }
.cm-s-inner .cm-attribute { color: rgb(0, 0, 204); }
.cm-s-inner .cm-header, .cm-s-inner.cm-header { color: rgb(0, 0, 255); }
.cm-s-inner .cm-quote, .cm-s-inner.cm-quote { color: rgb(0, 153, 0); }
.cm-s-inner .cm-hr, .cm-s-inner.cm-hr { color: rgb(153, 153, 153); }
.cm-s-inner .cm-link, .cm-s-inner.cm-link { color: rgb(0, 0, 204); }
.cm-negative { color: rgb(221, 68, 68); }
.cm-positive { color: rgb(34, 153, 34); }
.cm-header, .cm-strong { font-weight: 700; }
.cm-del { text-decoration: line-through; }
.cm-em { font-style: italic; }
.cm-link { text-decoration: underline; }
.cm-error { color: red; }
.cm-invalidchar { color: red; }
.cm-constant { color: rgb(38, 139, 210); }
.cm-defined { color: rgb(181, 137, 0); }
div.CodeMirror span.CodeMirror-matchingbracket { color: rgb(0, 255, 0); }
div.CodeMirror span.CodeMirror-nonmatchingbracket { color: rgb(255, 34, 34); }
.cm-s-inner .CodeMirror-activeline-background { background: inherit; }
.CodeMirror { position: relative; overflow: hidden; }
.CodeMirror-scroll { height: 100%; outline: 0px; position: relative; box-sizing: content-box; background: inherit; }
.CodeMirror-sizer { position: relative; }
.CodeMirror-gutter-filler, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-vscrollbar { position: absolute; z-index: 6; display: none; outline: 0px; }
.CodeMirror-vscrollbar { right: 0px; top: 0px; overflow: hidden; }
.CodeMirror-hscrollbar { bottom: 0px; left: 0px; overflow: auto hidden; }
.CodeMirror-scrollbar-filler { right: 0px; bottom: 0px; }
.CodeMirror-gutter-filler { left: 0px; bottom: 0px; }
.CodeMirror-gutters { position: absolute; left: 0px; top: 0px; padding-bottom: 10px; z-index: 3; overflow-y: hidden; }
.CodeMirror-gutter { white-space: normal; height: 100%; box-sizing: content-box; padding-bottom: 30px; margin-bottom: -32px; display: inline-block; }
.CodeMirror-gutter-wrapper { position: absolute; z-index: 4; background: 0px 0px !important; border: none !important; }
.CodeMirror-gutter-background { position: absolute; top: 0px; bottom: 0px; z-index: 4; }
.CodeMirror-gutter-elt { position: absolute; cursor: default; z-index: 4; }
.CodeMirror-lines { cursor: text; }
.CodeMirror pre { border-radius: 0px; border-width: 0px; background: 0px 0px; font-family: inherit; font-size: inherit; margin: 0px; white-space: pre; overflow-wrap: normal; color: inherit; z-index: 2; position: relative; overflow: visible; }
.CodeMirror-wrap pre { overflow-wrap: break-word; white-space: pre-wrap; word-break: normal; }
.CodeMirror-code pre { border-right: 30px solid transparent; width: fit-content; }
.CodeMirror-wrap .CodeMirror-code pre { border-right: none; width: auto; }
.CodeMirror-linebackground { position: absolute; inset: 0px; z-index: 0; }
.CodeMirror-linewidget { position: relative; z-index: 2; overflow: auto; }
.CodeMirror-wrap .CodeMirror-scroll { overflow-x: hidden; }
.CodeMirror-measure { position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden; }
.CodeMirror-measure pre { position: static; }
.CodeMirror div.CodeMirror-cursor { position: absolute; visibility: hidden; border-right: none; width: 0px; }
.CodeMirror div.CodeMirror-cursor { visibility: hidden; }
.CodeMirror-focused div.CodeMirror-cursor { visibility: inherit; }
.cm-searching { background: rgba(255, 255, 0, 0.4); }
span.cm-underlined { text-decoration: underline; }
span.cm-strikethrough { text-decoration: line-through; }
.cm-tw-syntaxerror { color: rgb(255, 255, 255); background-color: rgb(153, 0, 0); }
.cm-tw-deleted { text-decoration: line-through; }
.cm-tw-header5 { font-weight: 700; }
.cm-tw-listitem:first-child { padding-left: 10px; }
.cm-tw-box { border-style: solid; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-color: inherit; border-top-width: 0px !important; }
.cm-tw-underline { text-decoration: underline; }
@media print {
  .CodeMirror div.CodeMirror-cursor { visibility: hidden; }
}


:root {
    --side-bar-bg-color: #fafafa;
    --control-text-color: #777;
}

@include-when-export url(https://fonts.loli.net/css?family=Open+Sans:400italic,700italic,700,400&subset=latin,latin-ext);

/* open-sans-regular - latin-ext_latin */
  /* open-sans-italic - latin-ext_latin */
    /* open-sans-700 - latin-ext_latin */
    /* open-sans-700italic - latin-ext_latin */
  html {
    font-size: 16px;
    -webkit-font-smoothing: antialiased;
}

body {
    font-family: "Open Sans","Clear Sans", "Helvetica Neue", Helvetica, Arial, 'Segoe UI Emoji', sans-serif;
    color: rgb(51, 51, 51);
    line-height: 1.6;
}

#write {
    max-width: 860px;
  	margin: 0 auto;
  	padding: 30px;
    padding-bottom: 100px;
}

@media only screen and (min-width: 1400px) {
	#write {
		max-width: 1024px;
	}
}

@media only screen and (min-width: 1800px) {
	#write {
		max-width: 1200px;
	}
}

#write > ul:first-child,
#write > ol:first-child{
    margin-top: 30px;
}

a {
    color: #4183C4;
}
h1,
h2,
h3,
h4,
h5,
h6 {
    position: relative;
    margin-top: 1rem;
    margin-bottom: 1rem;
    font-weight: bold;
    line-height: 1.4;
    cursor: text;
}
h1:hover a.anchor,
h2:hover a.anchor,
h3:hover a.anchor,
h4:hover a.anchor,
h5:hover a.anchor,
h6:hover a.anchor {
    text-decoration: none;
}
h1 tt,
h1 code {
    font-size: inherit;
}
h2 tt,
h2 code {
    font-size: inherit;
}
h3 tt,
h3 code {
    font-size: inherit;
}
h4 tt,
h4 code {
    font-size: inherit;
}
h5 tt,
h5 code {
    font-size: inherit;
}
h6 tt,
h6 code {
    font-size: inherit;
}
h1 {
    font-size: 2.25em;
    line-height: 1.2;
    border-bottom: 1px solid #eee;
}
h2 {
    font-size: 1.75em;
    line-height: 1.225;
    border-bottom: 1px solid #eee;
}

/*@media print {
    .typora-export h1,
    .typora-export h2 {
        border-bottom: none;
        padding-bottom: initial;
    }

    .typora-export h1::after,
    .typora-export h2::after {
        content: "";
        display: block;
        height: 100px;
        margin-top: -96px;
        border-top: 1px solid #eee;
    }
}*/

h3 {
    font-size: 1.5em;
    line-height: 1.43;
}
h4 {
    font-size: 1.25em;
}
h5 {
    font-size: 1em;
}
h6 {
   font-size: 1em;
    color: #777;
}
p,
blockquote,
ul,
ol,
dl,
table{
    margin: 0.8em 0;
}
li>ol,
li>ul {
    margin: 0 0;
}
hr {
    height: 2px;
    padding: 0;
    margin: 16px 0;
    background-color: #e7e7e7;
    border: 0 none;
    overflow: hidden;
    box-sizing: content-box;
}

li p.first {
    display: inline-block;
}
ul,
ol {
    padding-left: 30px;
}
ul:first-child,
ol:first-child {
    margin-top: 0;
}
ul:last-child,
ol:last-child {
    margin-bottom: 0;
}
blockquote {
    border-left: 4px solid #dfe2e5;
    padding: 0 15px;
    color: #777777;
}
blockquote blockquote {
    padding-right: 0;
}
table {
    padding: 0;
    word-break: initial;
}
table tr {
    border: 1px solid #dfe2e5;
    margin: 0;
    padding: 0;
}
table tr:nth-child(2n),
thead {
    background-color: #f8f8f8;
}
table th {
    font-weight: bold;
    border: 1px solid #dfe2e5;
    border-bottom: 0;
    margin: 0;
    padding: 6px 13px;
}
table td {
    border: 1px solid #dfe2e5;
    margin: 0;
    padding: 6px 13px;
}
table th:first-child,
table td:first-child {
    margin-top: 0;
}
table th:last-child,
table td:last-child {
    margin-bottom: 0;
}

.CodeMirror-lines {
    padding-left: 4px;
}

.code-tooltip {
    box-shadow: 0 1px 1px 0 rgba(0,28,36,.3);
    border-top: 1px solid #eef2f2;
}

.md-fences,
code,
tt {
    border: 1px solid #e7eaed;
    background-color: #f8f8f8;
    border-radius: 3px;
    padding: 0;
    padding: 2px 4px 0px 4px;
    font-size: 0.9em;
}

code {
    background-color: #f3f4f4;
    padding: 0 2px 0 2px;
}

.md-fences {
    margin-bottom: 15px;
    margin-top: 15px;
    padding-top: 8px;
    padding-bottom: 6px;
}


.md-task-list-item > input {
  margin-left: -1.3em;
}

@media print {
    html {
        font-size: 13px;
    }
    table,
    pre {
        page-break-inside: avoid;
    }
    pre {
        word-wrap: break-word;
    }
}

.md-fences {
	background-color: #f8f8f8;
}
#write pre.md-meta-block {
	padding: 1rem;
    font-size: 85%;
    line-height: 1.45;
    background-color: #f7f7f7;
    border: 0;
    border-radius: 3px;
    color: #777777;
    margin-top: 0 !important;
}

.mathjax-block>.code-tooltip {
	bottom: .375rem;
}

.md-mathjax-midline {
    background: #fafafa;
}

#write>h3.md-focus:before{
	left: -1.5625rem;
	top: .375rem;
}
#write>h4.md-focus:before{
	left: -1.5625rem;
	top: .285714286rem;
}
#write>h5.md-focus:before{
	left: -1.5625rem;
	top: .285714286rem;
}
#write>h6.md-focus:before{
	left: -1.5625rem;
	top: .285714286rem;
}
.md-image>.md-meta {
    /*border: 1px solid #ddd;*/
    border-radius: 3px;
    padding: 2px 0px 0px 4px;
    font-size: 0.9em;
    color: inherit;
}

.md-tag {
    color: #a7a7a7;
    opacity: 1;
}

.md-toc { 
    margin-top:20px;
    padding-bottom:20px;
}

.sidebar-tabs {
    border-bottom: none;
}

#typora-quick-open {
    border: 1px solid #ddd;
    background-color: #f8f8f8;
}

#typora-quick-open-item {
    background-color: #FAFAFA;
    border-color: #FEFEFE #e5e5e5 #e5e5e5 #eee;
    border-style: solid;
    border-width: 1px;
}

/** focus mode */
.on-focus-mode blockquote {
    border-left-color: rgba(85, 85, 85, 0.12);
}

header, .context-menu, .megamenu-content, footer{
    font-family: "Segoe UI", "Arial", sans-serif;
}

.file-node-content:hover .file-node-icon,
.file-node-content:hover .file-node-open-state{
    visibility: visible;
}

.mac-seamless-mode #typora-sidebar {
    background-color: #fafafa;
    background-color: var(--side-bar-bg-color);
}

.md-lang {
    color: #b4654d;
}

/*.html-for-mac {
    --item-hover-bg-color: #E6F0FE;
}*/

#md-notification .btn {
    border: 0;
}

.dropdown-menu .divider {
    border-color: #e5e5e5;
    opacity: 0.4;
}

.ty-preferences .window-content {
    background-color: #fafafa;
}

.ty-preferences .nav-group-item.active {
    color: white;
    background: #999;
}

.menu-item-container a.menu-style-btn {
    background-color: #f5f8fa;
    background-image: linear-gradient( 180deg , hsla(0, 0%, 100%, 0.8), hsla(0, 0%, 100%, 0)); 
}



mjx-container[jax="SVG"] {
  direction: ltr;
}

mjx-container[jax="SVG"] > svg {
  overflow: visible;
  min-height: 1px;
  min-width: 1px;
}

mjx-container[jax="SVG"] > svg a {
  fill: blue;
  stroke: blue;
}

mjx-assistive-mml {
  position: absolute !important;
  top: 0px;
  left: 0px;
  clip: rect(1px, 1px, 1px, 1px);
  padding: 1px 0px 0px 0px !important;
  border: 0px !important;
  display: block !important;
  width: auto !important;
  overflow: hidden !important;
  -webkit-touch-callout: none;
  -webkit-user-select: none;
  -khtml-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}

mjx-assistive-mml[display="block"] {
  width: 100% !important;
}

mjx-container[jax="SVG"][display="true"] {
  display: block;
  text-align: center;
  margin: 1em 0;
}

mjx-container[jax="SVG"][display="true"][width="full"] {
  display: flex;
}

mjx-container[jax="SVG"][justify="left"] {
  text-align: left;
}

mjx-container[jax="SVG"][justify="right"] {
  text-align: right;
}

g[data-mml-node="merror"] > g {
  fill: red;
  stroke: red;
}

g[data-mml-node="merror"] > rect[data-background] {
  fill: yellow;
  stroke: none;
}

g[data-mml-node="mtable"] > line[data-line], svg[data-table] > g > line[data-line] {
  stroke-width: 70px;
  fill: none;
}

g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame] {
  stroke-width: 70px;
  fill: none;
}

g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed {
  stroke-dasharray: 140;
}

g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted {
  stroke-linecap: round;
  stroke-dasharray: 0,140;
}

g[data-mml-node="mtable"] > g > svg {
  overflow: visible;
}

[jax="SVG"] mjx-tool {
  display: inline-block;
  position: relative;
  width: 0;
  height: 0;
}

[jax="SVG"] mjx-tool > mjx-tip {
  position: absolute;
  top: 0;
  left: 0;
}

mjx-tool > mjx-tip {
  display: inline-block;
  padding: .2em;
  border: 1px solid #888;
  font-size: 70%;
  background-color: #F8F8F8;
  color: black;
  box-shadow: 2px 2px 5px #AAAAAA;
}

g[data-mml-node="maction"][data-toggle] {
  cursor: pointer;
}

mjx-status {
  display: block;
  position: fixed;
  left: 1em;
  bottom: 1em;
  min-width: 25%;
  padding: .2em .4em;
  border: 1px solid #888;
  font-size: 90%;
  background-color: #F8F8F8;
  color: black;
}

foreignObject[data-mjx-xml] {
  font-family: initial;
  line-height: normal;
  overflow: visible;
}

mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {
  stroke-width: 3;
}

g[data-mml-node="xypic"] path {
  stroke-width: inherit;
}

.MathJax g[data-mml-node="xypic"] path {
  stroke-width: inherit;
}
mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c] {
							stroke-width: 0;
						}
</style><title>【FFMPEG】源码分析：av_read_frame</title>
</head>
<body class='typora-export os-windows typora-export-show-outline typora-export-no-collapse-outline'><div class='typora-export-content'>
<div class="typora-export-sidebar"><div class="outline-content"><li class="outline-item-wrapper outline-h1"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#ffmpeg源码分析avreadframe">【FFMPEG】源码分析：<code>av_read_frame</code></a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#目录">目录</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#avreadframe"><code>av_read_frame</code></a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#ffreadpacket"><code>ff_read_packet</code></a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#ffflvdemuxer"><code>ff_flv_demuxer</code></a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#flv封装格式"><code>FLV</code>封装格式</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#audio-tag-data"><code>Audio Tag Data</code></a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h4"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#video-tag-data"><code>Video Tag Data</code></a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#parsepacket"><code>parse_packet</code></a></div><ul class="outline-children"></ul></li></ul></li><li class="outline-item-wrapper outline-h2"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#附录">附录</a></div><ul class="outline-children"><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#readframeinternal源码"><code>read_frame_internal</code>源码</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#ffreadpacket源码"><code>ff_read_packet</code>源码</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#flvreadpacket源码"><code>flv_read_packet</code>源码</a></div><ul class="outline-children"></ul></li><li class="outline-item-wrapper outline-h3"><div class="outline-item"><span class="outline-expander"></span><a class="outline-label" href="#parsepacket源码"><code>parse_packet</code>源码</a></div><ul class="outline-children"></ul></li></ul></li></ul></li></div></div><div id='write'  class=''><h1 id='ffmpeg源码分析avreadframe'><span>【FFMPEG】源码分析：</span><code>av_read_frame</code></h1><p><span>参考：</span></p><ul><li><span>雷霄骅 </span><a href='https://blog.csdn.net/leixiaohua1020/article/details/12678577'><span>ffmpeg 源代码简单分析 ： av_read_frame()</span></a></li></ul><h2 id='目录'><span>目录</span></h2><div class='md-toc' mdtype='toc'><p class="md-toc-content" role="list"><span role="listitem" class="md-toc-item md-toc-h1" data-ref="n0"><a class="md-toc-inner" href="#ffmpeg源码分析avreadframe">【FFMPEG】源码分析：<code>av_read_frame</code></a></span><span role="listitem" class="md-toc-item md-toc-h2" data-ref="n6"><a class="md-toc-inner" href="#目录">目录</a></span><span role="listitem" class="md-toc-item md-toc-h2" data-ref="n8"><a class="md-toc-inner" href="#avreadframe"><code>av_read_frame</code></a></span><span role="listitem" class="md-toc-item md-toc-h2" data-ref="n24"><a class="md-toc-inner" href="#ffreadpacket"><code>ff_read_packet</code></a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n26"><a class="md-toc-inner" href="#ffflvdemuxer"><code>ff_flv_demuxer</code></a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n31"><a class="md-toc-inner" href="#flv封装格式"><code>FLV</code>封装格式</a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n35"><a class="md-toc-inner" href="#audio-tag-data"><code>Audio Tag Data</code></a></span><span role="listitem" class="md-toc-item md-toc-h4" data-ref="n43"><a class="md-toc-inner" href="#video-tag-data"><code>Video Tag Data</code></a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n55"><a class="md-toc-inner" href="#parsepacket"><code>parse_packet</code></a></span><span role="listitem" class="md-toc-item md-toc-h2" data-ref="n57"><a class="md-toc-inner" href="#附录">附录</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n58"><a class="md-toc-inner" href="#readframeinternal源码"><code>read_frame_internal</code>源码</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n61"><a class="md-toc-inner" href="#ffreadpacket源码"><code>ff_read_packet</code>源码</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n63"><a class="md-toc-inner" href="#flvreadpacket源码"><code>flv_read_packet</code>源码</a></span><span role="listitem" class="md-toc-item md-toc-h3" data-ref="n65"><a class="md-toc-inner" href="#parsepacket源码"><code>parse_packet</code>源码</a></span></p></div><h2 id='avreadframe'><code>av_read_frame</code></h2><p><code>ffmpeg</code><span>中的</span><code>av_read_frame()</code><span>的作用是读取码流中的音频若干帧或者视频一帧。例如，解码视频的时候，每解码一个视频帧，需要先调用 </span><code>av_read_frame()</code><span>获得一帧视频的压缩数据，然后才能对该数据进行解码（例如</span><code>H.264</code><span>中一帧压缩数据通常对应一个</span><code>NAL</code><span>）。</span></p><blockquote><p><span>通过</span><code>av_read_packet()</code><span>，读取一个包，需要说明的是此函数必须是包含整数帧的，不存在半帧的情况，以</span><code>ts</code><span>流为例，是读取一个完整的</span><code>PES</code><span>包（一个完整</span><code>pes</code><span>包包含若干视频或音频</span><code>es</code><span>包），读取完毕后，通过</span><code>av_parser_parse2()</code><span>分析出视频一帧（或音频若干帧），返回，下次进入循环的时候，如果上次的数据没有完全取完，则</span><code>st = s-&gt;cur_st;</code><span>不是</span><code>NULL</code><span>，即再此进入</span><code>av_parser_parse2()</code><span>流程，而不是下面的</span><code>av_read_packet（）</code><span>流程，这样就保证了，如果读取一次包含了</span><mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg xmlns="http://www.w3.org/2000/svg" width="2.009ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 888 683" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" style="vertical-align: 0px;"><defs><path id="MJX-2-TEX-I-1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></defs><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><use data-c="1D441" xlink:href="#MJX-2-TEX-I-1D441"></use></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>N</mi></math></mjx-assistive-mml></mjx-container><script type="math/tex">N</script><span>帧视频数据（以视频为例），则调用</span><code>av_read_frame（）</code><mjx-container class="MathJax" jax="SVG" style="position: relative;"><svg xmlns="http://www.w3.org/2000/svg" width="2.009ex" height="1.545ex" role="img" focusable="false" viewBox="0 -683 888 683" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" style="vertical-align: 0px;"><defs><path id="MJX-2-TEX-I-1D441" d="M234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637Z"></path></defs><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><use data-c="1D441" xlink:href="#MJX-2-TEX-I-1D441"></use></g></g></g></svg><mjx-assistive-mml unselectable="on" display="inline"><math xmlns="http://www.w3.org/1998/Math/MathML"><mi>N</mi></math></mjx-assistive-mml></mjx-container><script type="math/tex">N</script><span>次都不会去读数据，而是返回第一次读取的数据，直到全部解析完毕。</span></p></blockquote><p><code>av_read_frame()</code><span>的声明位于</span><code>libavformat\avformat.h</code><span>，如下所示。</span></p><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="c++" style="break-inside: unset;"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="c++"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.5px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">/**</span></span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* Return the next frame of a stream.</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* This function returns what is stored in the file, and does not validate</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* that what is there are valid frames for the decoder. It will split what is</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* stored in the file into frames and return one for each call. It will not</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* omit invalid data between valid frames so as to give the decoder the maximum</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* information possible for decoding.</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">*</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* On success, the returned packet is reference-counted (pkt-&gt;buf is set) and</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* valid indefinitely. The packet must be freed with av_packet_unref() when</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* it is no longer needed. For video, the packet contains exactly one frame.</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* For audio, it contains an integer number of frames if each frame has</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* a known fixed size (e.g. PCM or ADPCM data). If the audio frames have</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* a variable size (e.g. MPEG audio), then it contains one frame.</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">*</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* pkt-&gt;pts, pkt-&gt;dts and pkt-&gt;duration are always set to correct</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* values in AVStream.time_base units (and guessed if the format cannot</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* provide them). pkt-&gt;pts can be AV_NOPTS_VALUE if the video format</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* has B-frames, so it is better to rely on pkt-&gt;dts if you do not</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* decompress the payload.</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">*</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* @return 0 if OK, &lt; 0 on error or end of file. On error, pkt will be blank</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* &nbsp; &nbsp; &nbsp; &nbsp; (as if it came from av_packet_alloc()).</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">*</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* @note pkt will be initialized, so it may be uninitialized, but it must not</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* &nbsp; &nbsp; &nbsp; contain data that needs to be freed.</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">*/</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable-3">int</span> <span class="cm-def">av_read_frame</span>(<span class="cm-variable">AVFormatContext</span> <span class="cm-operator">*</span><span class="cm-variable">s</span>, <span class="cm-variable">AVPacket</span> <span class="cm-operator">*</span><span class="cm-variable">pkt</span>);</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 644px;"></div><div class="CodeMirror-gutters" style="display: none; height: 644px;"></div></div></div></pre><p><code>av_read_frame()</code><span>使用方法在注释中写得很详细，用中文简单描述一下它的两个参数：</span></p><blockquote><p><code>s</code><span>：输入的</span><code>AVFormatContext</code></p><p><code>pkt</code><span>：输出的</span><code>AVPacket</code></p></blockquote><p><span>如果返回0则说明读取正常。</span></p><p><img src="https://gitee.com/zyuegege/images/raw/master/imgs/%E3%80%90FFMPEG%E3%80%91av_read_frame.svg" referrerpolicy="no-referrer" alt="【FFMPEG】av_read_frame"></p><p><code>read_frame_internal()</code><span>代码比较长，这里只简单看一下它前面的部分。它前面部分有2步是十分关键的：</span>
<span>（1）调用了</span><code>ff_read_packet()</code><span>从相应的</span><code>AVInputFormat</code><span>读取数据。</span></p><p><span>（2）如果媒体频流需要使用</span><code>AVCodecParser</code><span>，则调用</span><code>parse_packet()</code><span>解析相应的</span><code>AVPacket</code><span>。</span></p><p><span>下面我们分成分别看一下</span><code>ff_read_packet()</code><span>和</span><code>parse_packet()</code><span>的源代码。</span></p><p>&nbsp;</p><h2 id='ffreadpacket'><code>ff_read_packet</code></h2><p><code>ff_read_packet()</code><span>中最关键的地方就是调用了</span><code>AVInputFormat</code><span>的</span><code>read_packet()</code><span>方法。</span><code>AVInputFormat</code><span>的</span><code>read_packet()</code><span>是一个函数指针，指向当前的</span><code>AVInputFormat</code><span>的读取数据的函数。</span></p><h3 id='ffflvdemuxer'><code>ff_flv_demuxer</code></h3><p><span>在这里我们以</span><code>FLV</code><span>封装格式对应的</span><code>AVInputFormat</code><span>为例，看看</span><code>read_packet()</code><span>的实现函数是什么样子的。</span></p><p><code>FLV</code><span>封装格式对应的</span><code>AVInputFormat</code><span>的定义位于</span><code>libavformat\flvdec.c</code><span>，如下所示。</span></p><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="c++"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="c++"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.5px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">const</span> <span class="cm-variable">AVInputFormat</span> <span class="cm-variable">ff_flv_demuxer</span> <span class="cm-operator">=</span> {</span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  .<span class="cm-variable">name</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-operator">=</span> <span class="cm-string">"flv"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  .<span class="cm-variable">long_name</span> &nbsp; &nbsp; &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">NULL_IF_CONFIG_SMALL</span>(<span class="cm-string">"FLV (Flash Video)"</span>),</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  .<span class="cm-variable">priv_data_size</span> <span class="cm-operator">=</span> <span class="cm-keyword">sizeof</span>(<span class="cm-variable">FLVContext</span>),</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  .<span class="cm-variable">read_probe</span> &nbsp; &nbsp; <span class="cm-operator">=</span> <span class="cm-variable">flv_probe</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  .<span class="cm-variable">read_header</span> &nbsp; &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">flv_read_header</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  .<span class="cm-variable">read_packet</span> &nbsp; &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">flv_read_packet</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  .<span class="cm-variable">read_seek</span> &nbsp; &nbsp; &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">flv_read_seek</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  .<span class="cm-variable">read_close</span> &nbsp; &nbsp; <span class="cm-operator">=</span> <span class="cm-variable">flv_read_close</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  .<span class="cm-variable">extensions</span> &nbsp; &nbsp; <span class="cm-operator">=</span> <span class="cm-string">"flv"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  .<span class="cm-variable">priv_class</span> &nbsp; &nbsp; <span class="cm-operator">=</span> <span class="cm-operator">&amp;</span><span class="cm-variable">flv_kux_class</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">};</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 276px;"></div><div class="CodeMirror-gutters" style="display: none; height: 276px;"></div></div></div></pre><p><span>从</span><code>ff_flv_demuxer</code><span>的定义可以看出，</span><code>read_packet()</code><span>对应的是</span><code>flv_read_packet()</code><span>函数。在看</span><code>flv_read_packet()</code><span>函数之前。</span></p><h3 id='flv封装格式'><code>FLV</code><span>封装格式</span></h3><p><span>我们先回顾一下</span><code>FLV</code><span>封装格式的结构，如下图所示。</span></p><p><img src="https://gitee.com/zyuegege/images/raw/master/imgs/20150312023125560.jpg" referrerpolicy="no-referrer" alt="img"></p><p><span>从图中可以看出，</span><code>FLV</code><span>文件体部分是由一个一个的</span><code>Tag</code><span>连接起来的（中间间隔着</span><code>Previous Tag Size</code><span>）。每个</span><code>Tag</code><span>包含了</span><code>Tag Header</code><span>和</span><code>Tag Data</code><span>两个部分。</span><code>Tag Data</code><span>根据</span><code>Tag</code><span>的</span><code>Type</code><span>不同而不同：可以分为音频</span><code>Tag Data</code><span>，视频</span><code>Tag Data</code><span>以及</span><code>Script Tag Data</code><span>。下面简述一下音频</span><code>Tag Data</code><span>和视频</span><code>Tag Data</code><span>。</span></p><h4 id='audio-tag-data'><code>Audio Tag Data</code></h4><p><code>Audio Tag</code><span>在官方标准中定义如下:</span></p><p><img src="https://gitee.com/zyuegege/images/raw/master/imgs/20150312023624519.jpg" referrerpolicy="no-referrer"></p><p><code>Audio Tag</code><span>开始的第</span><code>1</code><span>个字节包含了音频数据的参数信息，从第</span><code>2</code><span>个字节开始为音频流数据。</span>
<span>第</span><code>1</code><span>个字节的前</span><code>4</code><span>位的数值表示了音频数据格式：</span></p><blockquote><p><span>0 = Linear PCM, platform endian</span>
<span>1 = ADPCM</span>
<span>2 = MP3</span>
<span>3 = Linear PCM, little endian</span>
<span>4 = Nellymoser 16-kHz mono</span>
<span>5 = Nellymoser 8-kHz mono</span>
<span>6 = Nellymoser</span>
<span>7 = G.711 A-law logarithmic PCM</span>
<span>8 = G.711 mu-law logarithmic PCM</span>
<span>9 = reserved</span>
<span>10 = AAC</span>
<span>14 = MP3 8-Khz</span>
<span>15 = Device-specific sound</span></p></blockquote><p><span>第1个字节的第5-6位的数值表示采样率：0 = 5.5kHz，1 = 11KHz，2 = 22 kHz，3 = 44 kHz。</span>
<span>第1个字节的第7位表示采样精度：0 = 8bits，1 = 16bits。</span>
<span>第1个字节的第8位表示音频类型：0 = sndMono，1 = sndStereo。</span>
<span>其中，当音频编码为AAC的时候，第一个字节后面存储的是AACAUDIODATA，格式如下所示。</span></p><p><img src="https://gitee.com/zyuegege/images/raw/master/imgs/20150312023528906.jpg" referrerpolicy="no-referrer" alt="img"></p><h4 id='video-tag-data'><code>Video Tag Data</code></h4><p><code>Video Tag</code><span>在官方标准中的定义如下：</span></p><p><img src="https://gitee.com/zyuegege/images/raw/master/imgs/20150312023548671.jpg" referrerpolicy="no-referrer" alt="img"></p><p><span>Video Tag也用开始的第1个字节包含视频数据的参数信息，从第2个字节为视频流数据。</span>
<span>第1个字节的前4位的数值表示帧类型（FrameType）：</span></p><blockquote><p><span>1: keyframe (for AVC, a seekableframe)（关键帧）</span>
<span>2: inter frame (for AVC, a nonseekableframe)</span>
<span>3: disposable inter frame (H.263only)</span>
<span>4: generated keyframe (reservedfor server use only)</span>
<span>5: video info/command frame</span></p></blockquote><p><span>第1个字节的后4位的数值表示视频编码ID（CodecID）：</span></p><blockquote><p><span>1: JPEG (currently unused)</span>
<span>2: Sorenson H.263</span>
<span>3: Screen video</span>
<span>4: On2 VP6</span>
<span>5: On2 VP6 with alpha channel</span>
<span>6: Screen video version 2</span>
<span>7: AVC</span></p></blockquote><p><span>其中，当音频编码为AVC（H.264）的时候，第一个字节后面存储的是AVCVIDEOPACKET，格式如下所示：</span></p><p><img src="https://gitee.com/zyuegege/images/raw/master/imgs/20150312023714268.jpg" referrerpolicy="no-referrer" alt="img"></p><p><span>了解了FLV的基本格式之后，就可以看一下</span><code>FLV</code><span>解析</span><code>Tag</code><span>的函数</span><code>flv_read_packet()</code><span>了，</span><code>flv_read_packet()</code><span>的代码比较长，但是逻辑比较简单。它的主要功能就是根据FLV文件格式的规范，逐层解析</span><code>Tag</code><span>以及</span><code>TagData</code><span>，获取</span><code>Tag</code><span>以及</span><code>TagData</code><span>中的信息。比较关键的地方已经写上了注释，不再详细叙述。</span></p><h3 id='parsepacket'><code>parse_packet</code></h3><p><code>parse_packet()</code><span>给需要</span><code>AVCodecParser</code><span>的媒体流提供解析</span><code>AVPacket</code><span>的功能。代码中可以看出，最终调用了相应</span><code>AVCodecParser</code><span>的</span><code>av_parser_parse2()</code><span>函数，解析出来</span><code>AVPacket</code><span>。此后根据解析的信息还进行了一系列的赋值工作，不再详细叙述。</span></p><h2 id='附录'><span>附录</span></h2><h3 id='readframeinternal源码'><code>read_frame_internal</code><span>源码</span></h3><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="c++" style="break-inside: unset;"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="c++"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.5px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">static</span> <span class="cm-variable-3">int</span> <span class="cm-def">read_frame_internal</span>(<span class="cm-variable">AVFormatContext</span> <span class="cm-operator">*</span><span class="cm-variable">s</span>, <span class="cm-variable">AVPacket</span> <span class="cm-operator">*</span><span class="cm-variable">pkt</span>)</span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">{</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">FFFormatContext</span> <span class="cm-operator">*</span><span class="cm-keyword">const</span> <span class="cm-variable">si</span> <span class="cm-operator">=</span> <span class="cm-variable">ffformatcontext</span>(<span class="cm-variable">s</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">ret</span>, <span class="cm-variable">got_packet</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">AVDictionary</span> <span class="cm-operator">*</span><span class="cm-variable">metadata</span> <span class="cm-operator">=</span> <span class="cm-variable">NULL</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">while</span> (<span class="cm-operator">!</span><span class="cm-variable">got_packet</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-operator">!</span><span class="cm-variable">si</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parse_queue</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">AVStream</span> <span class="cm-operator">*</span><span class="cm-variable">st</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FFStream</span> <span class="cm-operator">*</span><span class="cm-variable">sti</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* read next packet */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">ff_read_packet</span>(<span class="cm-variable">s</span>, <span class="cm-variable">pkt</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">ret</span> <span class="cm-operator">&lt;</span> <span class="cm-number">0</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">ret</span> <span class="cm-operator">==</span> <span class="cm-variable">AVERROR</span>(<span class="cm-variable">EAGAIN</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">ret</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* flush the parsers */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">for</span> (<span class="cm-variable-3">unsigned</span> <span class="cm-variable">i</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>; <span class="cm-variable">i</span> <span class="cm-operator">&lt;</span> <span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">nb_streams</span>; <span class="cm-variable">i</span><span class="cm-operator">++</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">AVStream</span> <span class="cm-operator">*</span><span class="cm-keyword">const</span> <span class="cm-variable">st</span> &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">streams</span>[<span class="cm-variable">i</span>];</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FFStream</span> <span class="cm-operator">*</span><span class="cm-keyword">const</span> <span class="cm-variable">sti</span> <span class="cm-operator">=</span> <span class="cm-variable">ffstream</span>(<span class="cm-variable">st</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">need_parsing</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">parse_packet</span>(<span class="cm-variable">s</span>, <span class="cm-variable">pkt</span>, <span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">index</span>, <span class="cm-number">1</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* all remaining packets are now in parse_queue =&gt;</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-comment">* really terminate parsing */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">break</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">st</span> &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">streams</span>[<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">stream_index</span>];</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">sti</span> <span class="cm-operator">=</span> <span class="cm-variable">ffstream</span>(<span class="cm-variable">st</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">event_flags</span> <span class="cm-operator">|=</span> <span class="cm-variable">AVSTREAM_EVENT_FLAG_NEW_PACKETS</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* update context if required */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">need_context_update</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">avcodec_is_open</span>(<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">avctx</span>)) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_log</span>(<span class="cm-variable">s</span>, <span class="cm-variable">AV_LOG_DEBUG</span>, <span class="cm-string">"Demuxer context update while decoder is open, closing and trying to re-open\n"</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">avcodec_close</span>(<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">avctx</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">info</span><span class="cm-operator">-&gt;</span><span class="cm-variable">found_decoder</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* close parser, because it depends on the codec */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">avctx</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_id</span> <span class="cm-operator">!=</span> <span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_id</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_parser_close</span>(<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span> <span class="cm-operator">=</span> <span class="cm-variable">NULL</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">avcodec_parameters_to_context</span>(<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">avctx</span>, <span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">ret</span> <span class="cm-operator">&lt;</span> <span class="cm-number">0</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_packet_unref</span>(<span class="cm-variable">pkt</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">ret</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">need_context_update</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pts</span> <span class="cm-operator">!=</span> <span class="cm-variable">AV_NOPTS_VALUE</span> <span class="cm-operator">&amp;&amp;</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">dts</span> <span class="cm-operator">!=</span> <span class="cm-variable">AV_NOPTS_VALUE</span> <span class="cm-operator">&amp;&amp;</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pts</span> <span class="cm-operator">&lt;</span> <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">dts</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_log</span>(<span class="cm-variable">s</span>, <span class="cm-variable">AV_LOG_WARNING</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-string">"Invalid timestamps stream=%d, pts=%s, dts=%s, size=%d\n"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">stream_index</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">av_ts2str</span>(<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pts</span>),</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">av_ts2str</span>(<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">dts</span>),</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">size</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">debug</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">FF_FDEBUG_TS</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_log</span>(<span class="cm-variable">s</span>, <span class="cm-variable">AV_LOG_DEBUG</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-string">"ff_read_packet stream=%d, pts=%s, dts=%s, size=%d, duration=%"</span><span class="cm-variable">PRId64</span><span class="cm-string">", flags=%d\n"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">stream_index</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">av_ts2str</span>(<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pts</span>),</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">av_ts2str</span>(<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">dts</span>),</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">size</span>, <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">duration</span>, <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">flags</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">need_parsing</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-operator">!</span><span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-operator">!</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">flags</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">AVFMT_FLAG_NOPARSE</span>)) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span> <span class="cm-operator">=</span> <span class="cm-variable">av_parser_init</span>(<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_id</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-operator">!</span><span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_log</span>(<span class="cm-variable">s</span>, <span class="cm-variable">AV_LOG_VERBOSE</span>, <span class="cm-string">"parser not found for codec "</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-string">"%s, packets or times may be invalid.\n"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">avcodec_get_name</span>(<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_id</span>));</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* no parser available: just output the raw packets */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">need_parsing</span> <span class="cm-operator">=</span> <span class="cm-variable">AVSTREAM_PARSE_NONE</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  } <span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">need_parsing</span> <span class="cm-operator">==</span> <span class="cm-variable">AVSTREAM_PARSE_HEADERS</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span><span class="cm-operator">-&gt;</span><span class="cm-variable">flags</span> <span class="cm-operator">|=</span> <span class="cm-variable">PARSER_FLAG_COMPLETE_FRAMES</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">need_parsing</span> <span class="cm-operator">==</span> <span class="cm-variable">AVSTREAM_PARSE_FULL_ONCE</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span><span class="cm-operator">-&gt;</span><span class="cm-variable">flags</span> <span class="cm-operator">|=</span> <span class="cm-variable">PARSER_FLAG_ONCE</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">need_parsing</span> <span class="cm-operator">==</span> <span class="cm-variable">AVSTREAM_PARSE_FULL_RAW</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span><span class="cm-operator">-&gt;</span><span class="cm-variable">flags</span> <span class="cm-operator">|=</span> <span class="cm-variable">PARSER_FLAG_USE_CODEC_TS</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-operator">!</span><span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">need_parsing</span> <span class="cm-operator">||</span> <span class="cm-operator">!</span><span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* no parsing needed: we just output the packet as is */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">compute_pkt_fields</span>(<span class="cm-variable">s</span>, <span class="cm-variable">st</span>, <span class="cm-variable">NULL</span>, <span class="cm-variable">pkt</span>, <span class="cm-variable">AV_NOPTS_VALUE</span>, <span class="cm-variable">AV_NOPTS_VALUE</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> ((<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">iformat</span><span class="cm-operator">-&gt;</span><span class="cm-variable">flags</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">AVFMT_GENERIC_INDEX</span>) <span class="cm-operator">&amp;&amp;</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  (<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">flags</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">AV_PKT_FLAG_KEY</span>) <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">dts</span> <span class="cm-operator">!=</span> <span class="cm-variable">AV_NOPTS_VALUE</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ff_reduce_index</span>(<span class="cm-variable">s</span>, <span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">index</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_add_index_entry</span>(<span class="cm-variable">st</span>, <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pos</span>, <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">dts</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-number">0</span>, <span class="cm-number">0</span>, <span class="cm-variable">AVINDEX_KEYFRAME</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">got_packet</span> <span class="cm-operator">=</span> <span class="cm-number">1</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  } <span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">discard</span> <span class="cm-operator">&lt;</span> <span class="cm-variable">AVDISCARD_ALL</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> ((<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">parse_packet</span>(<span class="cm-variable">s</span>, <span class="cm-variable">pkt</span>, <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">stream_index</span>, <span class="cm-number">0</span>)) <span class="cm-operator">&lt;</span> <span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">ret</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">sample_rate</span> <span class="cm-operator">=</span> <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">avctx</span><span class="cm-operator">-&gt;</span><span class="cm-variable">sample_rate</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">bit_rate</span> <span class="cm-operator">=</span> <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">avctx</span><span class="cm-operator">-&gt;</span><span class="cm-variable">bit_rate</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">channels</span> <span class="cm-operator">=</span> <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">avctx</span><span class="cm-operator">-&gt;</span><span class="cm-variable">channels</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">channel_layout</span> <span class="cm-operator">=</span> <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">avctx</span><span class="cm-operator">-&gt;</span><span class="cm-variable">channel_layout</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_id</span> <span class="cm-operator">=</span> <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">avctx</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_id</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  } <span class="cm-keyword">else</span> {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* free packet */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_packet_unref</span>(<span class="cm-variable">pkt</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">flags</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">AV_PKT_FLAG_KEY</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">skip_to_keyframe</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">skip_to_keyframe</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_packet_unref</span>(<span class="cm-variable">pkt</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">got_packet</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-operator">!</span><span class="cm-variable">got_packet</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">si</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parse_queue</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">avpriv_packet_list_get</span>(<span class="cm-operator">&amp;</span><span class="cm-variable">si</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parse_queue</span>, <span class="cm-operator">&amp;</span><span class="cm-variable">si</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parse_queue_end</span>, <span class="cm-variable">pkt</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">ret</span> <span class="cm-operator">&gt;=</span> <span class="cm-number">0</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">AVStream</span> <span class="cm-operator">*</span><span class="cm-keyword">const</span> <span class="cm-variable">st</span> &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">streams</span>[<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">stream_index</span>];</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FFStream</span> <span class="cm-operator">*</span><span class="cm-keyword">const</span> <span class="cm-variable">sti</span> <span class="cm-operator">=</span> <span class="cm-variable">ffstream</span>(<span class="cm-variable">st</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">discard_padding</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">first_discard_sample</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pts</span> <span class="cm-operator">!=</span> <span class="cm-variable">AV_NOPTS_VALUE</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">int64_t</span> <span class="cm-variable">pts</span> <span class="cm-operator">=</span> <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pts</span> <span class="cm-operator">-</span> (<span class="cm-variable">is_relative</span>(<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pts</span>) <span class="cm-operator">?</span> <span class="cm-variable">RELATIVE_TS_BASE</span> : <span class="cm-number">0</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">int64_t</span> <span class="cm-variable">sample</span> <span class="cm-operator">=</span> <span class="cm-variable">ts_to_samples</span>(<span class="cm-variable">st</span>, <span class="cm-variable">pts</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">duration</span> <span class="cm-operator">=</span> <span class="cm-variable">ts_to_samples</span>(<span class="cm-variable">st</span>, <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">duration</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">int64_t</span> <span class="cm-variable">end_sample</span> <span class="cm-operator">=</span> <span class="cm-variable">sample</span> <span class="cm-operator">+</span> <span class="cm-variable">duration</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">duration</span> <span class="cm-operator">&gt;</span> <span class="cm-number">0</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">end_sample</span> <span class="cm-operator">&gt;=</span> <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">first_discard_sample</span> <span class="cm-operator">&amp;&amp;</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">sample</span> <span class="cm-operator">&lt;</span> <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">last_discard_sample</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">discard_padding</span> <span class="cm-operator">=</span> <span class="cm-variable">FFMIN</span>(<span class="cm-variable">end_sample</span> <span class="cm-operator">-</span> <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">first_discard_sample</span>, <span class="cm-variable">duration</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">start_skip_samples</span> <span class="cm-operator">&amp;&amp;</span> (<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pts</span> <span class="cm-operator">==</span> <span class="cm-number">0</span> <span class="cm-operator">||</span> <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pts</span> <span class="cm-operator">==</span> <span class="cm-variable">RELATIVE_TS_BASE</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">skip_samples</span> <span class="cm-operator">=</span> <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">start_skip_samples</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">skip_samples</span> <span class="cm-operator">||</span> <span class="cm-variable">discard_padding</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">uint8_t</span> <span class="cm-operator">*</span><span class="cm-variable">p</span> <span class="cm-operator">=</span> <span class="cm-variable">av_packet_new_side_data</span>(<span class="cm-variable">pkt</span>, <span class="cm-variable">AV_PKT_DATA_SKIP_SAMPLES</span>, <span class="cm-number">10</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">p</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">AV_WL32</span>(<span class="cm-variable">p</span>, <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">skip_samples</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">AV_WL32</span>(<span class="cm-variable">p</span> <span class="cm-operator">+</span> <span class="cm-number">4</span>, <span class="cm-variable">discard_padding</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_log</span>(<span class="cm-variable">s</span>, <span class="cm-variable">AV_LOG_DEBUG</span>, <span class="cm-string">"demuxer injecting skip %d / discard %d\n"</span>, <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">skip_samples</span>, <span class="cm-variable">discard_padding</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">skip_samples</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">inject_global_side_data</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">for</span> (<span class="cm-variable-3">int</span> <span class="cm-variable">i</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>; <span class="cm-variable">i</span> <span class="cm-operator">&lt;</span> <span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">nb_side_data</span>; <span class="cm-variable">i</span><span class="cm-operator">++</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">const</span> <span class="cm-variable">AVPacketSideData</span> <span class="cm-operator">*</span><span class="cm-keyword">const</span> <span class="cm-variable">src_sd</span> <span class="cm-operator">=</span> <span class="cm-operator">&amp;</span><span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">side_data</span>[<span class="cm-variable">i</span>];</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">uint8_t</span> <span class="cm-operator">*</span><span class="cm-variable">dst_data</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">av_packet_get_side_data</span>(<span class="cm-variable">pkt</span>, <span class="cm-variable">src_sd</span><span class="cm-operator">-&gt;</span><span class="cm-variable">type</span>, <span class="cm-variable">NULL</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">continue</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">dst_data</span> <span class="cm-operator">=</span> <span class="cm-variable">av_packet_new_side_data</span>(<span class="cm-variable">pkt</span>, <span class="cm-variable">src_sd</span><span class="cm-operator">-&gt;</span><span class="cm-variable">type</span>, <span class="cm-variable">src_sd</span><span class="cm-operator">-&gt;</span><span class="cm-variable">size</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-operator">!</span><span class="cm-variable">dst_data</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_log</span>(<span class="cm-variable">s</span>, <span class="cm-variable">AV_LOG_WARNING</span>, <span class="cm-string">"Could not inject global side data\n"</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">continue</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">memcpy</span>(<span class="cm-variable">dst_data</span>, <span class="cm-variable">src_sd</span><span class="cm-operator">-&gt;</span><span class="cm-variable">data</span>, <span class="cm-variable">src_sd</span><span class="cm-operator">-&gt;</span><span class="cm-variable">size</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">inject_global_side_data</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">av_opt_get_dict_val</span>(<span class="cm-variable">s</span>, <span class="cm-string">"metadata"</span>, <span class="cm-variable">AV_OPT_SEARCH_CHILDREN</span>, <span class="cm-operator">&amp;</span><span class="cm-variable">metadata</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">metadata</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">event_flags</span> <span class="cm-operator">|=</span> <span class="cm-variable">AVFMT_EVENT_FLAG_METADATA_UPDATED</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_dict_copy</span>(<span class="cm-operator">&amp;</span><span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">metadata</span>, <span class="cm-variable">metadata</span>, <span class="cm-number">0</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_dict_free</span>(<span class="cm-operator">&amp;</span><span class="cm-variable">metadata</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_opt_set_dict_val</span>(<span class="cm-variable">s</span>, <span class="cm-string">"metadata"</span>, <span class="cm-variable">NULL</span>, <span class="cm-variable">AV_OPT_SEARCH_CHILDREN</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">debug</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">FF_FDEBUG_TS</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_log</span>(<span class="cm-variable">s</span>, <span class="cm-variable">AV_LOG_DEBUG</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-string">"read_frame_internal stream=%d, pts=%s, dts=%s, "</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-string">"size=%d, duration=%"</span><span class="cm-variable">PRId64</span><span class="cm-string">", flags=%d\n"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">stream_index</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">av_ts2str</span>(<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pts</span>),</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">av_ts2str</span>(<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">dts</span>),</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">size</span>, <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">duration</span>, <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">flags</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-comment">/* A demuxer might have returned EOF because of an IO error, let's</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; <span class="cm-comment">* propagate this back to the user. */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">ret</span> <span class="cm-operator">==</span> <span class="cm-variable">AVERROR_EOF</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span><span class="cm-operator">-&gt;</span><span class="cm-variable">error</span> <span class="cm-operator">&lt;</span> <span class="cm-number">0</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span><span class="cm-operator">-&gt;</span><span class="cm-variable">error</span> <span class="cm-operator">!=</span> <span class="cm-variable">AVERROR</span>(<span class="cm-variable">EAGAIN</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span><span class="cm-operator">-&gt;</span><span class="cm-variable">error</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">ret</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">}</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 4416px;"></div><div class="CodeMirror-gutters" style="display: none; height: 4416px;"></div></div></div></pre><p>&nbsp;</p><h3 id='ffreadpacket源码'><code>ff_read_packet</code><span>源码</span></h3><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="c++" style="break-inside: unset;"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="c++"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.5px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable-3">int</span> <span class="cm-def">ff_read_packet</span>(<span class="cm-variable">AVFormatContext</span> <span class="cm-operator">*</span><span class="cm-variable">s</span>, <span class="cm-variable">AVPacket</span> <span class="cm-operator">*</span><span class="cm-variable">pkt</span>)</span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">{</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">FFFormatContext</span> <span class="cm-operator">*</span><span class="cm-keyword">const</span> <span class="cm-variable">si</span> <span class="cm-operator">=</span> <span class="cm-variable">ffformatcontext</span>(<span class="cm-variable">s</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">err</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-meta">#if FF_API_INIT_PACKET</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">FF_DISABLE_DEPRECATION_WARNINGS</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">data</span> <span class="cm-operator">=</span> <span class="cm-variable">NULL</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">size</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">av_init_packet</span>(<span class="cm-variable">pkt</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">FF_ENABLE_DEPRECATION_WARNINGS</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-meta">#else</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">av_packet_unref</span>(<span class="cm-variable">pkt</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-meta">#endif</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">for</span> (;;) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">PacketList</span> <span class="cm-operator">*</span><span class="cm-variable">pktl</span> <span class="cm-operator">=</span> <span class="cm-variable">si</span><span class="cm-operator">-&gt;</span><span class="cm-variable">raw_packet_buffer</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">AVStream</span> <span class="cm-operator">*</span><span class="cm-variable">st</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FFStream</span> <span class="cm-operator">*</span><span class="cm-variable">sti</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">const</span> <span class="cm-variable">AVPacket</span> <span class="cm-operator">*</span><span class="cm-variable">pkt1</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">pktl</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">AVStream</span> <span class="cm-operator">*</span><span class="cm-keyword">const</span> <span class="cm-variable">st</span> <span class="cm-operator">=</span> <span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">streams</span>[<span class="cm-variable">pktl</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pkt</span>.<span class="cm-variable">stream_index</span>];</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">si</span><span class="cm-operator">-&gt;</span><span class="cm-variable">raw_packet_buffer_remaining_size</span> <span class="cm-operator">&lt;=</span> <span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> ((<span class="cm-variable">err</span> <span class="cm-operator">=</span> <span class="cm-variable">probe_codec</span>(<span class="cm-variable">s</span>, <span class="cm-variable">st</span>, <span class="cm-variable">NULL</span>)) <span class="cm-operator">&lt;</span> <span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">err</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">ffstream</span>(<span class="cm-variable">st</span>)<span class="cm-operator">-&gt;</span><span class="cm-variable">request_probe</span> <span class="cm-operator">&lt;=</span> <span class="cm-number">0</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">avpriv_packet_list_get</span>(<span class="cm-operator">&amp;</span><span class="cm-variable">si</span><span class="cm-operator">-&gt;</span><span class="cm-variable">raw_packet_buffer</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-operator">&amp;</span><span class="cm-variable">si</span><span class="cm-operator">-&gt;</span><span class="cm-variable">raw_packet_buffer_end</span>, <span class="cm-variable">pkt</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">si</span><span class="cm-operator">-&gt;</span><span class="cm-variable">raw_packet_buffer_remaining_size</span> <span class="cm-operator">+=</span> <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">size</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-number">0</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">err</span> <span class="cm-operator">=</span> <span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">iformat</span><span class="cm-operator">-&gt;</span><span class="cm-variable">read_packet</span>(<span class="cm-variable">s</span>, <span class="cm-variable">pkt</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">err</span> <span class="cm-operator">&lt;</span> <span class="cm-number">0</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_packet_unref</span>(<span class="cm-variable">pkt</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* Some demuxers return FFERROR_REDO when they consume</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-comment">data and discard it (ignored streams, junk, extradata).</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-comment">We must re-call the demuxer to get the real packet. */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">err</span> <span class="cm-operator">==</span> <span class="cm-variable">FFERROR_REDO</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">continue</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-operator">!</span><span class="cm-variable">pktl</span> <span class="cm-operator">||</span> <span class="cm-variable">err</span> <span class="cm-operator">==</span> <span class="cm-variable">AVERROR</span>(<span class="cm-variable">EAGAIN</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">err</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">for</span> (<span class="cm-variable-3">unsigned</span> <span class="cm-variable">i</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>; <span class="cm-variable">i</span> <span class="cm-operator">&lt;</span> <span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">nb_streams</span>; <span class="cm-variable">i</span><span class="cm-operator">++</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">AVStream</span> <span class="cm-operator">*</span><span class="cm-keyword">const</span> <span class="cm-variable">st</span> &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">streams</span>[<span class="cm-variable">i</span>];</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FFStream</span> <span class="cm-operator">*</span><span class="cm-keyword">const</span> <span class="cm-variable">sti</span> <span class="cm-operator">=</span> <span class="cm-variable">ffstream</span>(<span class="cm-variable">st</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">probe_packets</span> <span class="cm-operator">||</span> <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">request_probe</span> <span class="cm-operator">&gt;</span> <span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> ((<span class="cm-variable">err</span> <span class="cm-operator">=</span> <span class="cm-variable">probe_codec</span>(<span class="cm-variable">s</span>, <span class="cm-variable">st</span>, <span class="cm-variable">NULL</span>)) <span class="cm-operator">&lt;</span> <span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">err</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_assert0</span>(<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">request_probe</span> <span class="cm-operator">&lt;=</span> <span class="cm-number">0</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">continue</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">err</span> <span class="cm-operator">=</span> <span class="cm-variable">av_packet_make_refcounted</span>(<span class="cm-variable">pkt</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">err</span> <span class="cm-operator">&lt;</span> <span class="cm-number">0</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_packet_unref</span>(<span class="cm-variable">pkt</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">err</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">flags</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">AV_PKT_FLAG_CORRUPT</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_log</span>(<span class="cm-variable">s</span>, <span class="cm-variable">AV_LOG_WARNING</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-string">"Packet corrupt (stream = %d, dts = %s)"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">stream_index</span>, <span class="cm-variable">av_ts2str</span>(<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">dts</span>));</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">flags</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">AVFMT_FLAG_DISCARD_CORRUPT</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_log</span>(<span class="cm-variable">s</span>, <span class="cm-variable">AV_LOG_WARNING</span>, <span class="cm-string">", dropping it.\n"</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_packet_unref</span>(<span class="cm-variable">pkt</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">continue</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_log</span>(<span class="cm-variable">s</span>, <span class="cm-variable">AV_LOG_WARNING</span>, <span class="cm-string">".\n"</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_assert0</span>(<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">stream_index</span> <span class="cm-operator">&lt;</span> (<span class="cm-variable-3">unsigned</span>)<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">nb_streams</span> <span class="cm-operator">&amp;&amp;</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-string">"Invalid stream index.\n"</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">st</span> &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">streams</span>[<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">stream_index</span>];</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">sti</span> <span class="cm-operator">=</span> <span class="cm-variable">ffstream</span>(<span class="cm-variable">st</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">update_wrap_reference</span>(<span class="cm-variable">s</span>, <span class="cm-variable">st</span>, <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">stream_index</span>, <span class="cm-variable">pkt</span>) <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pts_wrap_behavior</span> <span class="cm-operator">==</span> <span class="cm-variable">AV_PTS_WRAP_SUB_OFFSET</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">// correct first time stamps to negative values</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-operator">!</span><span class="cm-variable">is_relative</span>(<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">first_dts</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">first_dts</span> <span class="cm-operator">=</span> <span class="cm-variable">wrap_timestamp</span>(<span class="cm-variable">st</span>, <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">first_dts</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-operator">!</span><span class="cm-variable">is_relative</span>(<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">start_time</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">start_time</span> <span class="cm-operator">=</span> <span class="cm-variable">wrap_timestamp</span>(<span class="cm-variable">st</span>, <span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">start_time</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-operator">!</span><span class="cm-variable">is_relative</span>(<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">cur_dts</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">cur_dts</span> <span class="cm-operator">=</span> <span class="cm-variable">wrap_timestamp</span>(<span class="cm-variable">st</span>, <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">cur_dts</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">dts</span> <span class="cm-operator">=</span> <span class="cm-variable">wrap_timestamp</span>(<span class="cm-variable">st</span>, <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">dts</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pts</span> <span class="cm-operator">=</span> <span class="cm-variable">wrap_timestamp</span>(<span class="cm-variable">st</span>, <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pts</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">force_codec_ids</span>(<span class="cm-variable">s</span>, <span class="cm-variable">st</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* TODO: audio: time filter; video: frame reordering (pts != dts) */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">use_wallclock_as_timestamps</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">dts</span> <span class="cm-operator">=</span> <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pts</span> <span class="cm-operator">=</span> <span class="cm-variable">av_rescale_q</span>(<span class="cm-variable">av_gettime</span>(), <span class="cm-variable">AV_TIME_BASE_Q</span>, <span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">time_base</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-operator">!</span><span class="cm-variable">pktl</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">request_probe</span> <span class="cm-operator">&lt;=</span> <span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-number">0</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">err</span> <span class="cm-operator">=</span> <span class="cm-variable">avpriv_packet_list_put</span>(<span class="cm-operator">&amp;</span><span class="cm-variable">si</span><span class="cm-operator">-&gt;</span><span class="cm-variable">raw_packet_buffer</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-operator">&amp;</span><span class="cm-variable">si</span><span class="cm-operator">-&gt;</span><span class="cm-variable">raw_packet_buffer_end</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">pkt</span>, <span class="cm-variable">NULL</span>, <span class="cm-number">0</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">err</span> <span class="cm-operator">&lt;</span> <span class="cm-number">0</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_packet_unref</span>(<span class="cm-variable">pkt</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">err</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">pkt1</span> <span class="cm-operator">=</span> <span class="cm-operator">&amp;</span><span class="cm-variable">si</span><span class="cm-operator">-&gt;</span><span class="cm-variable">raw_packet_buffer_end</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pkt</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">si</span><span class="cm-operator">-&gt;</span><span class="cm-variable">raw_packet_buffer_remaining_size</span> <span class="cm-operator">-=</span> <span class="cm-variable">pkt1</span><span class="cm-operator">-&gt;</span><span class="cm-variable">size</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> ((<span class="cm-variable">err</span> <span class="cm-operator">=</span> <span class="cm-variable">probe_codec</span>(<span class="cm-variable">s</span>, <span class="cm-variable">st</span>, <span class="cm-variable">pkt1</span>)) <span class="cm-operator">&lt;</span> <span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">err</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">}</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 2668px;"></div><div class="CodeMirror-gutters" style="display: none; height: 2668px;"></div></div></div></pre><h3 id='flvreadpacket源码'><code>flv_read_packet</code><span>源码</span></h3><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="c++" style="break-inside: unset;"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="c++"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.5px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">static</span> <span class="cm-variable-3">int</span> <span class="cm-def">flv_read_packet</span>(<span class="cm-variable">AVFormatContext</span> <span class="cm-operator">*</span><span class="cm-variable">s</span>, <span class="cm-variable">AVPacket</span> <span class="cm-operator">*</span><span class="cm-variable">pkt</span>)</span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">{</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">FLVContext</span> <span class="cm-operator">*</span><span class="cm-variable">flv</span> <span class="cm-operator">=</span> <span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">priv_data</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">ret</span>, <span class="cm-variable">i</span>, <span class="cm-variable">size</span>, <span class="cm-variable">flags</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">enum</span> <span class="cm-def">FlvTagType</span> <span class="cm-def">type</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">stream_type</span><span class="cm-operator">=-</span><span class="cm-number">1</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">int64_t</span> <span class="cm-variable">next</span>, <span class="cm-variable">pos</span>, <span class="cm-variable">meta_pos</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">int64_t</span> <span class="cm-variable">dts</span>, <span class="cm-variable">pts</span> <span class="cm-operator">=</span> <span class="cm-variable">AV_NOPTS_VALUE</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">av_uninit</span>(<span class="cm-variable">channels</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">av_uninit</span>(<span class="cm-variable">sample_rate</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">AVStream</span> <span class="cm-operator">*</span><span class="cm-variable">st</span> &nbsp; &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">NULL</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">last</span> <span class="cm-operator">=</span> <span class="cm-operator">-</span><span class="cm-number">1</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">orig_size</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">retry</span>:</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-comment">/* pkt size is repeated at end. skip it */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">pos</span> &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">avio_tell</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">type</span> <span class="cm-operator">=</span> (<span class="cm-variable">avio_r8</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>) <span class="cm-operator">&amp;</span> <span class="cm-number">0x1F</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">orig_size</span> <span class="cm-operator">=</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">size</span> <span class="cm-operator">=</span> <span class="cm-variable">avio_rb24</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">sum_flv_tag_size</span> <span class="cm-operator">+=</span> <span class="cm-variable">size</span> <span class="cm-operator">+</span> <span class="cm-number">11</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">dts</span> &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">avio_rb24</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">dts</span> <span class="cm-operator">|=</span> (<span class="cm-variable-3">unsigned</span>)<span class="cm-variable">avio_r8</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>) <span class="cm-operator">&lt;&lt;</span> <span class="cm-number">24</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">av_log</span>(<span class="cm-variable">s</span>, <span class="cm-variable">AV_LOG_TRACE</span>, <span class="cm-string">"type:%d, size:%d, last:%d, dts:%"</span><span class="cm-variable">PRId64</span><span class="cm-string">" pos:%"</span><span class="cm-variable">PRId64</span><span class="cm-string">"\n"</span>, <span class="cm-variable">type</span>, <span class="cm-variable">size</span>, <span class="cm-variable">last</span>, <span class="cm-variable">dts</span>, <span class="cm-variable">avio_tell</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>));</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">avio_feof</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">AVERROR_EOF</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">avio_skip</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>, <span class="cm-number">3</span>); <span class="cm-comment">/* stream id, always 0 */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">flags</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">validate_next</span> <span class="cm-operator">&lt;</span> <span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">validate_count</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">int64_t</span> <span class="cm-variable">validate_pos</span> <span class="cm-operator">=</span> <span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">validate_index</span>[<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">validate_next</span>].<span class="cm-variable">pos</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">pos</span> <span class="cm-operator">==</span> <span class="cm-variable">validate_pos</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">FFABS</span>(<span class="cm-variable">dts</span> <span class="cm-operator">-</span> <span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">validate_index</span>[<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">validate_next</span>].<span class="cm-variable">dts</span>) <span class="cm-operator">&lt;=</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">VALIDATE_INDEX_TS_THRESH</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">validate_next</span><span class="cm-operator">++</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  } <span class="cm-keyword">else</span> {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">clear_index_entries</span>(<span class="cm-variable">s</span>, <span class="cm-variable">validate_pos</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">validate_count</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  } <span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">pos</span> <span class="cm-operator">&gt;</span> <span class="cm-variable">validate_pos</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">clear_index_entries</span>(<span class="cm-variable">s</span>, <span class="cm-variable">validate_pos</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">validate_count</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">size</span> <span class="cm-operator">==</span> <span class="cm-number">0</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">FFERROR_REDO</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">goto</span> <span class="cm-variable">leave</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">next</span> <span class="cm-operator">=</span> <span class="cm-variable">size</span> <span class="cm-operator">+</span> <span class="cm-variable">avio_tell</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">type</span> <span class="cm-operator">==</span> <span class="cm-variable">FLV_TAG_TYPE_AUDIO</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">stream_type</span> <span class="cm-operator">=</span> <span class="cm-variable">FLV_STREAM_TYPE_AUDIO</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">flags</span> &nbsp; &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">avio_r8</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">size</span><span class="cm-operator">--</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  } <span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">type</span> <span class="cm-operator">==</span> <span class="cm-variable">FLV_TAG_TYPE_VIDEO</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">stream_type</span> <span class="cm-operator">=</span> <span class="cm-variable">FLV_STREAM_TYPE_VIDEO</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">flags</span> &nbsp; &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">avio_r8</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">size</span><span class="cm-operator">--</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> ((<span class="cm-variable">flags</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">FLV_VIDEO_FRAMETYPE_MASK</span>) <span class="cm-operator">==</span> <span class="cm-variable">FLV_FRAME_VIDEO_INFO_CMD</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">goto</span> <span class="cm-variable">skip</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  } <span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">type</span> <span class="cm-operator">==</span> <span class="cm-variable">FLV_TAG_TYPE_META</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">stream_type</span><span class="cm-operator">=</span><span class="cm-variable">FLV_STREAM_TYPE_SUBTITLE</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">size</span> <span class="cm-operator">&gt;</span> <span class="cm-number">13</span> <span class="cm-operator">+</span> <span class="cm-number">1</span> <span class="cm-operator">+</span> <span class="cm-number">4</span>) { <span class="cm-comment">// Header-type metadata stuff</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">type</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">meta_pos</span> <span class="cm-operator">=</span> <span class="cm-variable">avio_tell</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">type</span> <span class="cm-operator">=</span> <span class="cm-variable">flv_read_metabody</span>(<span class="cm-variable">s</span>, <span class="cm-variable">next</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">type</span> <span class="cm-operator">==</span> <span class="cm-number">0</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">dts</span> <span class="cm-operator">==</span> <span class="cm-number">0</span> <span class="cm-operator">||</span> <span class="cm-variable">type</span> <span class="cm-operator">&lt;</span> <span class="cm-number">0</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">type</span> <span class="cm-operator">&lt;</span> <span class="cm-number">0</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">validate_count</span> <span class="cm-operator">&amp;&amp;</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">validate_index</span>[<span class="cm-number">0</span>].<span class="cm-variable">pos</span> &nbsp; &nbsp; <span class="cm-operator">&gt;</span> <span class="cm-variable">next</span> <span class="cm-operator">&amp;&amp;</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">validate_index</span>[<span class="cm-number">0</span>].<span class="cm-variable">pos</span> <span class="cm-operator">-</span> <span class="cm-number">4</span> <span class="cm-operator">&lt;</span> <span class="cm-variable">next</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_log</span>(<span class="cm-variable">s</span>, <span class="cm-variable">AV_LOG_WARNING</span>, <span class="cm-string">"Adjusting next position due to index mismatch\n"</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">next</span> <span class="cm-operator">=</span> <span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">validate_index</span>[<span class="cm-number">0</span>].<span class="cm-variable">pos</span> <span class="cm-operator">-</span> <span class="cm-number">4</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">goto</span> <span class="cm-variable">skip</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  } <span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">type</span> <span class="cm-operator">==</span> <span class="cm-variable">TYPE_ONTEXTDATA</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">avpriv_request_sample</span>(<span class="cm-variable">s</span>, <span class="cm-string">"OnTextData packet"</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">flv_data_packet</span>(<span class="cm-variable">s</span>, <span class="cm-variable">pkt</span>, <span class="cm-variable">dts</span>, <span class="cm-variable">next</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  } <span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">type</span> <span class="cm-operator">==</span> <span class="cm-variable">TYPE_ONCAPTION</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">flv_data_packet</span>(<span class="cm-variable">s</span>, <span class="cm-variable">pkt</span>, <span class="cm-variable">dts</span>, <span class="cm-variable">next</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  } <span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">type</span> <span class="cm-operator">==</span> <span class="cm-variable">TYPE_UNKNOWN</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">stream_type</span> <span class="cm-operator">=</span> <span class="cm-variable">FLV_STREAM_TYPE_DATA</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">avio_seek</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>, <span class="cm-variable">meta_pos</span>, <span class="cm-variable">SEEK_SET</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  } <span class="cm-keyword">else</span> {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_log</span>(<span class="cm-variable">s</span>, <span class="cm-variable">AV_LOG_DEBUG</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-string">"Skipping flv packet: type %d, size %d, flags %d.\n"</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">type</span>, <span class="cm-variable">size</span>, <span class="cm-variable">flags</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">skip</span>:</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">avio_seek</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>, <span class="cm-variable">next</span>, <span class="cm-variable">SEEK_SET</span>) <span class="cm-operator">!=</span> <span class="cm-variable">next</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">// This can happen if flv_read_metabody above read past</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">// next, on a non-seekable input, and the preceding data has</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">// been flushed out from the IO buffer.</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_log</span>(<span class="cm-variable">s</span>, <span class="cm-variable">AV_LOG_ERROR</span>, <span class="cm-string">"Unable to seek to the next packet\n"</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">AVERROR_INVALIDDATA</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">FFERROR_REDO</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">goto</span> <span class="cm-variable">leave</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-comment">/* skip empty data packets */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-operator">!</span><span class="cm-variable">size</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">FFERROR_REDO</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">goto</span> <span class="cm-variable">leave</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-comment">/* now find stream */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">for</span> (<span class="cm-variable">i</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>; <span class="cm-variable">i</span> <span class="cm-operator">&lt;</span> <span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">nb_streams</span>; <span class="cm-variable">i</span><span class="cm-operator">++</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">st</span> <span class="cm-operator">=</span> <span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">streams</span>[<span class="cm-variable">i</span>];</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">stream_type</span> <span class="cm-operator">==</span> <span class="cm-variable">FLV_STREAM_TYPE_AUDIO</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_type</span> <span class="cm-operator">==</span> <span class="cm-variable">AVMEDIA_TYPE_AUDIO</span> <span class="cm-operator">&amp;&amp;</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  (<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">audio_codec_id</span> <span class="cm-operator">||</span> <span class="cm-variable">flv_same_audio_codec</span>(<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span>, <span class="cm-variable">flags</span>)))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">break</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  } <span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">stream_type</span> <span class="cm-operator">==</span> <span class="cm-variable">FLV_STREAM_TYPE_VIDEO</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_type</span> <span class="cm-operator">==</span> <span class="cm-variable">AVMEDIA_TYPE_VIDEO</span> <span class="cm-operator">&amp;&amp;</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  (<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">video_codec_id</span> <span class="cm-operator">||</span> <span class="cm-variable">flv_same_video_codec</span>(<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span>, <span class="cm-variable">flags</span>)))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">break</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  } <span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">stream_type</span> <span class="cm-operator">==</span> <span class="cm-variable">FLV_STREAM_TYPE_SUBTITLE</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_type</span> <span class="cm-operator">==</span> <span class="cm-variable">AVMEDIA_TYPE_SUBTITLE</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">break</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  } <span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">stream_type</span> <span class="cm-operator">==</span> <span class="cm-variable">FLV_STREAM_TYPE_DATA</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_type</span> <span class="cm-operator">==</span> <span class="cm-variable">AVMEDIA_TYPE_DATA</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">break</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">i</span> <span class="cm-operator">==</span> <span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">nb_streams</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">static</span> <span class="cm-keyword">const</span> <span class="cm-keyword">enum</span> <span class="cm-def">AVMediaType</span> <span class="cm-def">stream_types</span>[] <span class="cm-operator">=</span> {<span class="cm-variable">AVMEDIA_TYPE_VIDEO</span>, <span class="cm-variable">AVMEDIA_TYPE_AUDIO</span>, <span class="cm-variable">AVMEDIA_TYPE_SUBTITLE</span>, <span class="cm-variable">AVMEDIA_TYPE_DATA</span>};</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">st</span> <span class="cm-operator">=</span> <span class="cm-variable">create_stream</span>(<span class="cm-variable">s</span>, <span class="cm-variable">stream_types</span>[<span class="cm-variable">stream_type</span>]);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-operator">!</span><span class="cm-variable">st</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">AVERROR</span>(<span class="cm-variable">ENOMEM</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">av_log</span>(<span class="cm-variable">s</span>, <span class="cm-variable">AV_LOG_TRACE</span>, <span class="cm-string">"%d %X %d \n"</span>, <span class="cm-variable">stream_type</span>, <span class="cm-variable">flags</span>, <span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">discard</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">time_pos</span> <span class="cm-operator">&lt;=</span> <span class="cm-variable">pos</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">dts</span> <span class="cm-operator">+=</span> <span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">time_offset</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> ((<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span><span class="cm-operator">-&gt;</span><span class="cm-variable">seekable</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">AVIO_SEEKABLE_NORMAL</span>) <span class="cm-operator">&amp;&amp;</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  ((<span class="cm-variable">flags</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">FLV_VIDEO_FRAMETYPE_MASK</span>) <span class="cm-operator">==</span> <span class="cm-variable">FLV_FRAME_KEY</span> <span class="cm-operator">||</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">stream_type</span> <span class="cm-operator">==</span> <span class="cm-variable">FLV_STREAM_TYPE_AUDIO</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_add_index_entry</span>(<span class="cm-variable">st</span>, <span class="cm-variable">pos</span>, <span class="cm-variable">dts</span>, <span class="cm-variable">size</span>, <span class="cm-number">0</span>, <span class="cm-variable">AVINDEX_KEYFRAME</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> ((<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">discard</span> <span class="cm-operator">&gt;=</span> <span class="cm-variable">AVDISCARD_NONKEY</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-operator">!</span>((<span class="cm-variable">flags</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">FLV_VIDEO_FRAMETYPE_MASK</span>) <span class="cm-operator">==</span> <span class="cm-variable">FLV_FRAME_KEY</span> <span class="cm-operator">||</span> <span class="cm-variable">stream_type</span> <span class="cm-operator">==</span> <span class="cm-variable">FLV_STREAM_TYPE_AUDIO</span>)) <span class="cm-operator">||</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  (<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">discard</span> <span class="cm-operator">&gt;=</span> <span class="cm-variable">AVDISCARD_BIDIR</span> <span class="cm-operator">&amp;&amp;</span> ((<span class="cm-variable">flags</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">FLV_VIDEO_FRAMETYPE_MASK</span>) <span class="cm-operator">==</span> <span class="cm-variable">FLV_FRAME_DISP_INTER</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">stream_type</span> <span class="cm-operator">==</span> <span class="cm-variable">FLV_STREAM_TYPE_VIDEO</span>)) <span class="cm-operator">||</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">discard</span> <span class="cm-operator">&gt;=</span> <span class="cm-variable">AVDISCARD_ALL</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">avio_seek</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>, <span class="cm-variable">next</span>, <span class="cm-variable">SEEK_SET</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">FFERROR_REDO</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">goto</span> <span class="cm-variable">leave</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-comment">// if not streamed and no duration from metadata then seek to end to find</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-comment">// the duration from the timestamps</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> ((<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span><span class="cm-operator">-&gt;</span><span class="cm-variable">seekable</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">AVIO_SEEKABLE_NORMAL</span>) <span class="cm-operator">&amp;&amp;</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  (<span class="cm-operator">!</span><span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">duration</span> <span class="cm-operator">||</span> <span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">duration</span> <span class="cm-operator">==</span> <span class="cm-variable">AV_NOPTS_VALUE</span>) <span class="cm-operator">&amp;&amp;</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-operator">!</span><span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">searched_for_end</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">size</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">const</span> <span class="cm-variable">int64_t</span> <span class="cm-variable">pos</span> &nbsp; <span class="cm-operator">=</span> <span class="cm-variable">avio_tell</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">// Read the last 4 bytes of the file, this should be the size of the</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">// previous FLV tag. Use the timestamp of its payload as duration.</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">int64_t</span> <span class="cm-variable">fsize</span> &nbsp; &nbsp; &nbsp; <span class="cm-operator">=</span> <span class="cm-variable">avio_size</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">retry_duration</span>:</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">avio_seek</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>, <span class="cm-variable">fsize</span> <span class="cm-operator">-</span> <span class="cm-number">4</span>, <span class="cm-variable">SEEK_SET</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">size</span> <span class="cm-operator">=</span> <span class="cm-variable">avio_rb32</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">size</span> <span class="cm-operator">&gt;</span> <span class="cm-number">0</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">size</span> <span class="cm-operator">&lt;</span> <span class="cm-variable">fsize</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">// Seek to the start of the last FLV tag at position (fsize - 4 - size)</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">// but skip the byte indicating the type.</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">avio_seek</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>, <span class="cm-variable">fsize</span> <span class="cm-operator">-</span> <span class="cm-number">3</span> <span class="cm-operator">-</span> <span class="cm-variable">size</span>, <span class="cm-variable">SEEK_SET</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">size</span> <span class="cm-operator">==</span> <span class="cm-variable">avio_rb24</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>) <span class="cm-operator">+</span> <span class="cm-number">11</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">uint32_t</span> <span class="cm-variable">ts</span> <span class="cm-operator">=</span> <span class="cm-variable">avio_rb24</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ts</span> &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-operator">|=</span> (<span class="cm-variable-3">unsigned</span>)<span class="cm-variable">avio_r8</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>) <span class="cm-operator">&lt;&lt;</span> <span class="cm-number">24</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">ts</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">duration</span> <span class="cm-operator">=</span> <span class="cm-variable">ts</span> <span class="cm-operator">*</span> (<span class="cm-variable">int64_t</span>)<span class="cm-variable">AV_TIME_BASE</span> <span class="cm-operator">/</span> <span class="cm-number">1000</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">fsize</span> <span class="cm-operator">&gt;=</span> <span class="cm-number">8</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">fsize</span> <span class="cm-operator">-</span> <span class="cm-number">8</span> <span class="cm-operator">&gt;=</span> <span class="cm-variable">size</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">fsize</span> <span class="cm-operator">-=</span> <span class="cm-variable">size</span><span class="cm-operator">+</span><span class="cm-number">4</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">goto</span> <span class="cm-variable">retry_duration</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">avio_seek</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>, <span class="cm-variable">pos</span>, <span class="cm-variable">SEEK_SET</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">searched_for_end</span> <span class="cm-operator">=</span> <span class="cm-number">1</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">stream_type</span> <span class="cm-operator">==</span> <span class="cm-variable">FLV_STREAM_TYPE_AUDIO</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">bits_per_coded_sample</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">channels</span> <span class="cm-operator">=</span> (<span class="cm-variable">flags</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">FLV_AUDIO_CHANNEL_MASK</span>) <span class="cm-operator">==</span> <span class="cm-variable">FLV_STEREO</span> <span class="cm-operator">?</span> <span class="cm-number">2</span> : <span class="cm-number">1</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">sample_rate</span> <span class="cm-operator">=</span> <span class="cm-number">44100</span> <span class="cm-operator">&lt;&lt;</span> ((<span class="cm-variable">flags</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">FLV_AUDIO_SAMPLERATE_MASK</span>) <span class="cm-operator">&gt;&gt;</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">FLV_AUDIO_SAMPLERATE_OFFSET</span>) <span class="cm-operator">&gt;&gt;</span> <span class="cm-number">3</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">bits_per_coded_sample</span> <span class="cm-operator">=</span> (<span class="cm-variable">flags</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">FLV_AUDIO_SAMPLESIZE_MASK</span>) <span class="cm-operator">?</span> <span class="cm-number">16</span> : <span class="cm-number">8</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-operator">!</span><span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">channels</span> <span class="cm-operator">||</span> <span class="cm-operator">!</span><span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">sample_rate</span> <span class="cm-operator">||</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-operator">!</span><span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">bits_per_coded_sample</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">channels</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">channels</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">channel_layout</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">channels</span> <span class="cm-operator">==</span> <span class="cm-number">1</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-operator">?</span> <span class="cm-variable">AV_CH_LAYOUT_MONO</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : <span class="cm-variable">AV_CH_LAYOUT_STEREO</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">sample_rate</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-operator">=</span> <span class="cm-variable">sample_rate</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">bits_per_coded_sample</span> <span class="cm-operator">=</span> <span class="cm-variable">bits_per_coded_sample</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-operator">!</span><span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_id</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">flv_set_audio_codec</span>(<span class="cm-variable">s</span>, <span class="cm-variable">st</span>, <span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">flags</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">FLV_AUDIO_CODECID_MASK</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">last_sample_rate</span> <span class="cm-operator">=</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">sample_rate</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-operator">=</span> <span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">sample_rate</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">last_channels</span> &nbsp; &nbsp;<span class="cm-operator">=</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">channels</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">channels</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  } <span class="cm-keyword">else</span> {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">AVCodecParameters</span> <span class="cm-operator">*</span><span class="cm-variable">par</span> <span class="cm-operator">=</span> <span class="cm-variable">avcodec_parameters_alloc</span>();</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-operator">!</span><span class="cm-variable">par</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">AVERROR</span>(<span class="cm-variable">ENOMEM</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">goto</span> <span class="cm-variable">leave</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">par</span><span class="cm-operator">-&gt;</span><span class="cm-variable">sample_rate</span> <span class="cm-operator">=</span> <span class="cm-variable">sample_rate</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">par</span><span class="cm-operator">-&gt;</span><span class="cm-variable">bits_per_coded_sample</span> <span class="cm-operator">=</span> <span class="cm-variable">bits_per_coded_sample</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">flv_set_audio_codec</span>(<span class="cm-variable">s</span>, <span class="cm-variable">st</span>, <span class="cm-variable">par</span>, <span class="cm-variable">flags</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">FLV_AUDIO_CODECID_MASK</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">sample_rate</span> <span class="cm-operator">=</span> <span class="cm-variable">par</span><span class="cm-operator">-&gt;</span><span class="cm-variable">sample_rate</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">avcodec_parameters_free</span>(<span class="cm-operator">&amp;</span><span class="cm-variable">par</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  } <span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">stream_type</span> <span class="cm-operator">==</span> <span class="cm-variable">FLV_STREAM_TYPE_VIDEO</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">flv_set_video_codec</span>(<span class="cm-variable">s</span>, <span class="cm-variable">st</span>, <span class="cm-variable">flags</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">FLV_VIDEO_CODECID_MASK</span>, <span class="cm-number">1</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">ret</span> <span class="cm-operator">&lt;</span> <span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">ret</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">size</span> <span class="cm-operator">-=</span> <span class="cm-variable">ret</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  } <span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">stream_type</span> <span class="cm-operator">==</span> <span class="cm-variable">FLV_STREAM_TYPE_SUBTITLE</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_id</span> <span class="cm-operator">=</span> <span class="cm-variable">AV_CODEC_ID_TEXT</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  } <span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">stream_type</span> <span class="cm-operator">==</span> <span class="cm-variable">FLV_STREAM_TYPE_DATA</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_id</span> <span class="cm-operator">=</span> <span class="cm-variable">AV_CODEC_ID_NONE</span>; <span class="cm-comment">// Opaque AMF data</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_id</span> <span class="cm-operator">==</span> <span class="cm-variable">AV_CODEC_ID_AAC</span> <span class="cm-operator">||</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_id</span> <span class="cm-operator">==</span> <span class="cm-variable">AV_CODEC_ID_H264</span> <span class="cm-operator">||</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_id</span> <span class="cm-operator">==</span> <span class="cm-variable">AV_CODEC_ID_MPEG4</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">type</span> <span class="cm-operator">=</span> <span class="cm-variable">avio_r8</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">size</span><span class="cm-operator">--</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">size</span> <span class="cm-operator">&lt;</span> <span class="cm-number">0</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">AVERROR_INVALIDDATA</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">goto</span> <span class="cm-variable">leave</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_id</span> <span class="cm-operator">==</span> <span class="cm-variable">AV_CODEC_ID_H264</span> <span class="cm-operator">||</span> <span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_id</span> <span class="cm-operator">==</span> <span class="cm-variable">AV_CODEC_ID_MPEG4</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">// sign extension</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">int32_t</span> <span class="cm-variable">cts</span> <span class="cm-operator">=</span> (<span class="cm-variable">avio_rb24</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>) <span class="cm-operator">+</span> <span class="cm-number">0xff800000</span>) <span class="cm-variable">^</span> <span class="cm-number">0xff800000</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">pts</span> <span class="cm-operator">=</span> <span class="cm-variable">av_sat_add64</span>(<span class="cm-variable">dts</span>, <span class="cm-variable">cts</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">cts</span> <span class="cm-operator">&lt;</span> <span class="cm-number">0</span>) { <span class="cm-comment">// dts might be wrong</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-operator">!</span><span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">wrong_dts</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_log</span>(<span class="cm-variable">s</span>, <span class="cm-variable">AV_LOG_WARNING</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-string">"Negative cts, previous timestamps might be wrong.\n"</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">wrong_dts</span> <span class="cm-operator">=</span> <span class="cm-number">1</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  } <span class="cm-keyword">else</span> <span class="cm-keyword">if</span> (<span class="cm-variable">FFABS</span>(<span class="cm-variable">dts</span> <span class="cm-operator">-</span> <span class="cm-variable">pts</span>) <span class="cm-operator">&gt;</span> <span class="cm-number">1000</span><span class="cm-operator">*</span><span class="cm-number">60</span><span class="cm-operator">*</span><span class="cm-number">15</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_log</span>(<span class="cm-variable">s</span>, <span class="cm-variable">AV_LOG_WARNING</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-string">"invalid timestamps %"</span><span class="cm-variable">PRId64</span><span class="cm-string">" %"</span><span class="cm-variable">PRId64</span><span class="cm-string">"\n"</span>, <span class="cm-variable">dts</span>, <span class="cm-variable">pts</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">dts</span> <span class="cm-operator">=</span> <span class="cm-variable">pts</span> <span class="cm-operator">=</span> <span class="cm-variable">AV_NOPTS_VALUE</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">type</span> <span class="cm-operator">==</span> <span class="cm-number">0</span> <span class="cm-operator">&amp;&amp;</span> (<span class="cm-operator">!</span><span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">extradata</span> <span class="cm-operator">||</span> <span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_id</span> <span class="cm-operator">==</span> <span class="cm-variable">AV_CODEC_ID_AAC</span> <span class="cm-operator">||</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_id</span> <span class="cm-operator">==</span> <span class="cm-variable">AV_CODEC_ID_H264</span>)) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">AVDictionaryEntry</span> <span class="cm-operator">*</span><span class="cm-variable">t</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">extradata</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> ((<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">flv_queue_extradata</span>(<span class="cm-variable">flv</span>, <span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>, <span class="cm-variable">stream_type</span>, <span class="cm-variable">size</span>)) <span class="cm-operator">&lt;</span> <span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">ret</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">FFERROR_REDO</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">goto</span> <span class="cm-variable">leave</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> ((<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">flv_get_extradata</span>(<span class="cm-variable">s</span>, <span class="cm-variable">st</span>, <span class="cm-variable">size</span>)) <span class="cm-operator">&lt;</span> <span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">ret</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* Workaround for buggy Omnia A/XE encoder */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">t</span> <span class="cm-operator">=</span> <span class="cm-variable">av_dict_get</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">metadata</span>, <span class="cm-string">"Encoder"</span>, <span class="cm-variable">NULL</span>, <span class="cm-number">0</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_id</span> <span class="cm-operator">==</span> <span class="cm-variable">AV_CODEC_ID_AAC</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">t</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-operator">!</span><span class="cm-variable">strcmp</span>(<span class="cm-variable">t</span><span class="cm-operator">-&gt;</span><span class="cm-variable">value</span>, <span class="cm-string">"Omnia A/XE"</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">extradata_size</span> <span class="cm-operator">=</span> <span class="cm-number">2</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">FFERROR_REDO</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">goto</span> <span class="cm-variable">leave</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-comment">/* skip empty data packets */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-operator">!</span><span class="cm-variable">size</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">FFERROR_REDO</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">goto</span> <span class="cm-variable">leave</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">av_get_packet</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>, <span class="cm-variable">pkt</span>, <span class="cm-variable">size</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">ret</span> <span class="cm-operator">&lt;</span> <span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">ret</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">dts</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">dts</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pts</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">pts</span> <span class="cm-operator">==</span> <span class="cm-variable">AV_NOPTS_VALUE</span> <span class="cm-operator">?</span> <span class="cm-variable">dts</span> : <span class="cm-variable">pts</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">stream_index</span> <span class="cm-operator">=</span> <span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">index</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pos</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">pos</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">new_extradata</span>[<span class="cm-variable">stream_type</span>]) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">av_packet_add_side_data</span>(<span class="cm-variable">pkt</span>, <span class="cm-variable">AV_PKT_DATA_NEW_EXTRADATA</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">new_extradata</span>[<span class="cm-variable">stream_type</span>],</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">new_extradata_size</span>[<span class="cm-variable">stream_type</span>]);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">ret</span> <span class="cm-operator">&gt;=</span> <span class="cm-number">0</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">new_extradata</span>[<span class="cm-variable">stream_type</span>] &nbsp; &nbsp; &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">NULL</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">new_extradata_size</span>[<span class="cm-variable">stream_type</span>] <span class="cm-operator">=</span> <span class="cm-number">0</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">stream_type</span> <span class="cm-operator">==</span> <span class="cm-variable">FLV_STREAM_TYPE_AUDIO</span> <span class="cm-operator">&amp;&amp;</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  (<span class="cm-variable">sample_rate</span> <span class="cm-operator">!=</span> <span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">last_sample_rate</span> <span class="cm-operator">||</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">channels</span> &nbsp; &nbsp;<span class="cm-operator">!=</span> <span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">last_channels</span>)) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">last_sample_rate</span> <span class="cm-operator">=</span> <span class="cm-variable">sample_rate</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">last_channels</span> &nbsp; &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">channels</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ff_add_param_change</span>(<span class="cm-variable">pkt</span>, <span class="cm-variable">channels</span>, <span class="cm-number">0</span>, <span class="cm-variable">sample_rate</span>, <span class="cm-number">0</span>, <span class="cm-number">0</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">stream_type</span> <span class="cm-operator">==</span> <span class="cm-variable">FLV_STREAM_TYPE_AUDIO</span> <span class="cm-operator">||</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  (<span class="cm-variable">flags</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">FLV_VIDEO_FRAMETYPE_MASK</span>) <span class="cm-operator">==</span> <span class="cm-variable">FLV_FRAME_KEY</span> <span class="cm-operator">||</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">stream_type</span> <span class="cm-operator">==</span> <span class="cm-variable">FLV_STREAM_TYPE_SUBTITLE</span> <span class="cm-operator">||</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">stream_type</span> <span class="cm-operator">==</span> <span class="cm-variable">FLV_STREAM_TYPE_DATA</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">flags</span> <span class="cm-operator">|=</span> <span class="cm-variable">AV_PKT_FLAG_KEY</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">leave</span>:</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">last</span> <span class="cm-operator">=</span> <span class="cm-variable">avio_rb32</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-operator">!</span><span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">trust_datasize</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">last</span> <span class="cm-operator">!=</span> <span class="cm-variable">orig_size</span> <span class="cm-operator">+</span> <span class="cm-number">11</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">last</span> <span class="cm-operator">!=</span> <span class="cm-variable">orig_size</span> <span class="cm-operator">+</span> <span class="cm-number">10</span> <span class="cm-operator">&amp;&amp;</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-operator">!</span><span class="cm-variable">avio_feof</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>) <span class="cm-operator">&amp;&amp;</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  (<span class="cm-variable">last</span> <span class="cm-operator">!=</span> <span class="cm-variable">orig_size</span> <span class="cm-operator">||</span> <span class="cm-operator">!</span><span class="cm-variable">last</span>) <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">last</span> <span class="cm-operator">!=</span> <span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">sum_flv_tag_size</span> <span class="cm-operator">&amp;&amp;</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-operator">!</span><span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">broken_sizes</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_log</span>(<span class="cm-variable">s</span>, <span class="cm-variable">AV_LOG_ERROR</span>, <span class="cm-string">"Packet mismatch %d %d %d\n"</span>, <span class="cm-variable">last</span>, <span class="cm-variable">orig_size</span> <span class="cm-operator">+</span> <span class="cm-number">11</span>, <span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">sum_flv_tag_size</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">avio_seek</span>(<span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pb</span>, <span class="cm-variable">pos</span> <span class="cm-operator">+</span> <span class="cm-number">1</span>, <span class="cm-variable">SEEK_SET</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">resync</span>(<span class="cm-variable">s</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_packet_unref</span>(<span class="cm-variable">pkt</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">ret</span> <span class="cm-operator">&gt;=</span> <span class="cm-number">0</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">goto</span> <span class="cm-variable">retry</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">ret</span> <span class="cm-operator">&gt;=</span> <span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">flv</span><span class="cm-operator">-&gt;</span><span class="cm-variable">last_ts</span> <span class="cm-operator">=</span> <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">dts</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">ret</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">}</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 7843px;"></div><div class="CodeMirror-gutters" style="display: none; height: 7843px;"></div></div></div></pre><h3 id='parsepacket源码'><code>parse_packet</code><span>源码</span></h3><pre class="md-fences md-end-block ty-contain-cm modeLoaded" spellcheck="false" lang="c++" style="break-inside: unset;"><div class="CodeMirror cm-s-inner cm-s-null-scroll CodeMirror-wrap" lang="c++"><div style="overflow: hidden; position: relative; width: 3px; height: 0px; top: 9.5px; left: 8px;"><textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea></div><div class="CodeMirror-scrollbar-filler" cm-not-content="true"></div><div class="CodeMirror-gutter-filler" cm-not-content="true"></div><div class="CodeMirror-scroll" tabindex="-1"><div class="CodeMirror-sizer" style="margin-left: 0px; margin-bottom: 0px; border-right-width: 0px; padding-right: 0px; padding-bottom: 0px;"><div style="position: relative; top: 0px;"><div class="CodeMirror-lines" role="presentation"><div role="presentation" style="position: relative; outline: none;"><div class="CodeMirror-measure"><pre><span>xxxxxxxxxx</span></pre></div><div class="CodeMirror-measure"></div><div style="position: relative; z-index: 1;"></div><div class="CodeMirror-code" role="presentation" style=""><div class="CodeMirror-activeline" style="position: relative;"><div class="CodeMirror-activeline-background CodeMirror-linebackground"></div><div class="CodeMirror-gutter-background CodeMirror-activeline-gutter" style="left: 0px; width: 0px;"></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-comment">/**</span></span></pre></div><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* Parse a packet, add all split parts to parse_queue.</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">*</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* @param pkt &nbsp; Packet to parse; must not be NULL.</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">* @param flush Indicates whether to flush. If set, pkt must be blank.</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> <span class="cm-comment">*/</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-keyword">static</span> <span class="cm-variable-3">int</span> <span class="cm-def">parse_packet</span>(<span class="cm-variable">AVFormatContext</span> <span class="cm-operator">*</span><span class="cm-variable">s</span>, <span class="cm-variable">AVPacket</span> <span class="cm-operator">*</span><span class="cm-variable">pkt</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">stream_index</span>, <span class="cm-variable-3">int</span> <span class="cm-variable">flush</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">{</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">FFFormatContext</span> <span class="cm-operator">*</span><span class="cm-keyword">const</span> <span class="cm-variable">si</span> <span class="cm-operator">=</span> <span class="cm-variable">ffformatcontext</span>(<span class="cm-variable">s</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">AVPacket</span> <span class="cm-operator">*</span><span class="cm-variable">out_pkt</span> <span class="cm-operator">=</span> <span class="cm-variable">si</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parse_pkt</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">AVStream</span> <span class="cm-operator">*</span><span class="cm-variable">st</span> <span class="cm-operator">=</span> <span class="cm-variable">s</span><span class="cm-operator">-&gt;</span><span class="cm-variable">streams</span>[<span class="cm-variable">stream_index</span>];</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">FFStream</span> <span class="cm-operator">*</span><span class="cm-keyword">const</span> <span class="cm-variable">sti</span> <span class="cm-operator">=</span> <span class="cm-variable">ffstream</span>(<span class="cm-variable">st</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">const</span> <span class="cm-variable">uint8_t</span> <span class="cm-operator">*</span><span class="cm-variable">data</span> <span class="cm-operator">=</span> <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">data</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">size</span> <span class="cm-operator">=</span> <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">size</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-number">0</span>, <span class="cm-variable">got_output</span> <span class="cm-operator">=</span> <span class="cm-variable">flush</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-operator">!</span><span class="cm-variable">size</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-operator">!</span><span class="cm-variable">flush</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span><span class="cm-operator">-&gt;</span><span class="cm-variable">flags</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">PARSER_FLAG_COMPLETE_FRAMES</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">// preserve 0-size sync packets</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">compute_pkt_fields</span>(<span class="cm-variable">s</span>, <span class="cm-variable">st</span>, <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span>, <span class="cm-variable">pkt</span>, <span class="cm-variable">AV_NOPTS_VALUE</span>, <span class="cm-variable">AV_NOPTS_VALUE</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">while</span> (<span class="cm-variable">size</span> <span class="cm-operator">&gt;</span> <span class="cm-number">0</span> <span class="cm-operator">||</span> (<span class="cm-variable">flush</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">got_output</span>)) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">int64_t</span> <span class="cm-variable">next_pts</span> <span class="cm-operator">=</span> <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pts</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">int64_t</span> <span class="cm-variable">next_dts</span> <span class="cm-operator">=</span> <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">dts</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable-3">int</span> <span class="cm-variable">len</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">len</span> <span class="cm-operator">=</span> <span class="cm-variable">av_parser_parse2</span>(<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span>, <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">avctx</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-operator">&amp;</span><span class="cm-variable">out_pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">data</span>, <span class="cm-operator">&amp;</span><span class="cm-variable">out_pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">size</span>, <span class="cm-variable">data</span>, <span class="cm-variable">size</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pts</span>, <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">dts</span>, <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pos</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pts</span> <span class="cm-operator">=</span> <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">dts</span> <span class="cm-operator">=</span> <span class="cm-variable">AV_NOPTS_VALUE</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pos</span> <span class="cm-operator">=</span> <span class="cm-operator">-</span><span class="cm-number">1</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* increment read pointer */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_assert1</span>(<span class="cm-variable">data</span> <span class="cm-operator">||</span> <span class="cm-operator">!</span><span class="cm-variable">len</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">data</span> &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">len</span> <span class="cm-operator">?</span> <span class="cm-variable">data</span> <span class="cm-operator">+</span> <span class="cm-variable">len</span> : <span class="cm-variable">data</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">size</span> <span class="cm-operator">-=</span> <span class="cm-variable">len</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">got_output</span> <span class="cm-operator">=</span> <span class="cm-operator">!!</span><span class="cm-variable">out_pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">size</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-operator">!</span><span class="cm-variable">out_pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">size</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">continue</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">buf</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">out_pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">data</span> <span class="cm-operator">==</span> <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">data</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* reference pkt-&gt;buf only when out_pkt-&gt;data is guaranteed to point</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-comment">* to data in it and not in the parser's internal buffer. */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* XXX: Ensure this is the case with all parsers when sti-&gt;parser-&gt;flags</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-comment">* is PARSER_FLAG_COMPLETE_FRAMES and check for that instead? */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">out_pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">buf</span> <span class="cm-operator">=</span> <span class="cm-variable">av_buffer_ref</span>(<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">buf</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-operator">!</span><span class="cm-variable">out_pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">buf</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">AVERROR</span>(<span class="cm-variable">ENOMEM</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">goto</span> <span class="cm-variable">fail</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  } <span class="cm-keyword">else</span> {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">av_packet_make_refcounted</span>(<span class="cm-variable">out_pkt</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">ret</span> <span class="cm-operator">&lt;</span> <span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">goto</span> <span class="cm-variable">fail</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">side_data</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">out_pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">side_data</span> &nbsp; &nbsp; &nbsp; <span class="cm-operator">=</span> <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">side_data</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">out_pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">side_data_elems</span> <span class="cm-operator">=</span> <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">side_data_elems</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">side_data</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">NULL</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">side_data_elems</span> &nbsp; &nbsp;<span class="cm-operator">=</span> <span class="cm-number">0</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-comment">/* set the duration */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">out_pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">duration</span> <span class="cm-operator">=</span> (<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span><span class="cm-operator">-&gt;</span><span class="cm-variable">flags</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">PARSER_FLAG_COMPLETE_FRAMES</span>) <span class="cm-operator">?</span> <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">duration</span> : <span class="cm-number">0</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codecpar</span><span class="cm-operator">-&gt;</span><span class="cm-variable">codec_type</span> <span class="cm-operator">==</span> <span class="cm-variable">AVMEDIA_TYPE_AUDIO</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">avctx</span><span class="cm-operator">-&gt;</span><span class="cm-variable">sample_rate</span> <span class="cm-operator">&gt;</span> <span class="cm-number">0</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">out_pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">duration</span> <span class="cm-operator">=</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_rescale_q_rnd</span>(<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span><span class="cm-operator">-&gt;</span><span class="cm-variable">duration</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (<span class="cm-variable">AVRational</span>) { <span class="cm-number">1</span>, <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">avctx</span><span class="cm-operator">-&gt;</span><span class="cm-variable">sample_rate</span> },</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">time_base</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">AV_ROUND_DOWN</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">out_pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">stream_index</span> <span class="cm-operator">=</span> <span class="cm-variable">st</span><span class="cm-operator">-&gt;</span><span class="cm-variable">index</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">out_pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pts</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pts</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">out_pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">dts</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span><span class="cm-operator">-&gt;</span><span class="cm-variable">dts</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">out_pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pos</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-operator">=</span> <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pos</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">out_pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">flags</span> &nbsp; &nbsp; &nbsp; <span class="cm-operator">|=</span> <span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">flags</span> <span class="cm-operator">&amp;</span> <span class="cm-variable">AV_PKT_FLAG_DISCARD</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">need_parsing</span> <span class="cm-operator">==</span> <span class="cm-variable">AVSTREAM_PARSE_FULL_RAW</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">out_pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pos</span> <span class="cm-operator">=</span> <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span><span class="cm-operator">-&gt;</span><span class="cm-variable">frame_offset</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span><span class="cm-operator">-&gt;</span><span class="cm-variable">key_frame</span> <span class="cm-operator">==</span> <span class="cm-number">1</span> <span class="cm-operator">||</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  (<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span><span class="cm-operator">-&gt;</span><span class="cm-variable">key_frame</span> <span class="cm-operator">==</span> <span class="cm-operator">-</span><span class="cm-number">1</span> <span class="cm-operator">&amp;&amp;</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pict_type</span> <span class="cm-operator">==</span> <span class="cm-variable">AV_PICTURE_TYPE_I</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">out_pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">flags</span> <span class="cm-operator">|=</span> <span class="cm-variable">AV_PKT_FLAG_KEY</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span><span class="cm-operator">-&gt;</span><span class="cm-variable">key_frame</span> <span class="cm-operator">==</span> <span class="cm-operator">-</span><span class="cm-number">1</span> <span class="cm-operator">&amp;&amp;</span> <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span><span class="cm-operator">-&gt;</span><span class="cm-variable">pict_type</span> <span class="cm-operator">==</span><span class="cm-variable">AV_PICTURE_TYPE_NONE</span> <span class="cm-operator">&amp;&amp;</span> (<span class="cm-variable">pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">flags</span><span class="cm-operator">&amp;</span><span class="cm-variable">AV_PKT_FLAG_KEY</span>))</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">out_pkt</span><span class="cm-operator">-&gt;</span><span class="cm-variable">flags</span> <span class="cm-operator">|=</span> <span class="cm-variable">AV_PKT_FLAG_KEY</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">compute_pkt_fields</span>(<span class="cm-variable">s</span>, <span class="cm-variable">st</span>, <span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span>, <span class="cm-variable">out_pkt</span>, <span class="cm-variable">next_dts</span>, <span class="cm-variable">next_pts</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">ret</span> <span class="cm-operator">=</span> <span class="cm-variable">avpriv_packet_list_put</span>(<span class="cm-operator">&amp;</span><span class="cm-variable">si</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parse_queue</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-operator">&amp;</span><span class="cm-variable">si</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parse_queue_end</span>,</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="cm-variable">out_pkt</span>, <span class="cm-variable">NULL</span>, <span class="cm-number">0</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">ret</span> <span class="cm-operator">&lt;</span> <span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-keyword">goto</span> <span class="cm-variable">fail</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-comment">/* end of the stream =&gt; close and free the parser */</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">flush</span>) {</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_parser_close</span>(<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">sti</span><span class="cm-operator">-&gt;</span><span class="cm-variable">parser</span> <span class="cm-operator">=</span> <span class="cm-variable">NULL</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp;  }</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span cm-text="" cm-zwsp="">
</span></span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"><span class="cm-variable">fail</span>:</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">if</span> (<span class="cm-variable">ret</span> <span class="cm-operator">&lt;</span> <span class="cm-number">0</span>)</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp; &nbsp; &nbsp;<span class="cm-variable">av_packet_unref</span>(<span class="cm-variable">out_pkt</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-variable">av_packet_unref</span>(<span class="cm-variable">pkt</span>);</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;"> &nbsp; &nbsp;<span class="cm-keyword">return</span> <span class="cm-variable">ret</span>;</span></pre><pre class=" CodeMirror-line " role="presentation"><span role="presentation" style="padding-right: 0.1px;">}</span></pre></div></div></div></div></div><div style="position: absolute; height: 0px; width: 1px; border-bottom: 0px solid transparent; top: 2668px;"></div><div class="CodeMirror-gutters" style="display: none; height: 2668px;"></div></div></div></pre><p>&nbsp;</p></div></div>

<script>(function(){var e=document.body.parentElement,t=[],n=null,i=document.body.classList.contains("typora-export-collapse-outline"),r=function(e,t,n){document.addEventListener(e,function(e){if(!e.defaultPrevented)for(var i=e.target;i&&i!=this;i=i.parentNode)if(i.matches(t)){!1===n.call(i,e)&&(e.preventDefault(),e.stopPropagation());break}},!1)};function o(){return e.scrollTop}r("click",".outline-expander",function(e){var t=this.closest(".outline-item-wrapper").classList;return t.contains("outline-item-open")?t.remove("outline-item-open"):t.add("outline-item-open"),d(),!1}),r("click",".outline-item",function(e){var t=this.querySelector(".outline-label");if(location.hash="#"+t.getAttribute("href"),i){var n=this.closest(".outline-item-wrapper").classList;n.contains("outline-item-open")||n.add("outline-item-open"),c(),n.add("outline-item-active")}});var a,s,l=function(){var e=o();n=null;for(var i=0;i<t.length&&t[i][1]-e<60;i++)n=t[i]},c=function(){document.querySelectorAll(".outline-item-active").forEach(e=>e.classList.remove("outline-item-active")),document.querySelectorAll(".outline-item-single.outline-item-open").forEach(e=>e.classList.remove("outline-item-open"))},d=function(){if(n){c();var e=document.querySelector('.outline-label[href="#'+(CSS.escape?CSS.escape(n[0]):n[0])+'"]');if(e)if(i){var t=e.closest(".outline-item-open>ul>.outline-item-wrapper");if(t)t.classList.add("outline-item-active");else{for(var r=(e=e.closest(".outline-item-wrapper")).parentElement.closest(".outline-item-wrapper");r;)r=(e=r).parentElement.closest(".outline-item-wrapper");e.classList.add("outline-item-active")}}else e.closest(".outline-item-wrapper").classList.add("outline-item-active")}};window.addEventListener("scroll",function(e){a&&clearTimeout(a),a=setTimeout(function(){l(),d()},300)});var u=function(){s=setTimeout(function(){!function(){t=[];var e=o();document.querySelector("#write").querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(n=>{var i=n.getAttribute("id");t.push([i,e+n.getBoundingClientRect().y])})}(),l(),d()},300)};window.addEventListener("resize",function(e){s&&clearTimeout(s),u()}),u()})();</script><script src="/js/typora-convert.js"></script>
</body>
</html>